| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
原来gcc也可以用long long ac,错误是因为你的代码中逻辑错误#include<stdio.h>
#include<string.h>
int K,N;
int ans[25],visit[25];
long long dp[25][25][2],sum,C;
void pan(int len)
{
int flag;
int i,j,k,s;
for(i=1;i<=N;i++)
{
if((dp[i][N][0]+dp[i][N][1])>=sum)
{
s=i;
ans[1]=i;
break;
}
sum-=dp[i][N][0]+dp[i][N][1];
}
if(sum<=dp[s][N][1])
flag=1;
else
{
sum-=dp[s][N][1];
flag=0;
}
int a=2;
len--;
while(len)
{
if(flag==1)
{
for(i=1;i<s;i++)
{
if(dp[i][len][0]>=sum)
{
s=i;
ans[a++]=i;
break;
}
sum-=dp[i][len][0];
}
}
if(flag==0)
{
for(i=s;i<=len;i++)
{
if(dp[i][len][1]>=sum)
{
s=i;
ans[a++]=i;
break;
}
sum-=dp[i][len][1];
}
}
len--;
flag=1-flag;
}
printf("%d",ans[1]);
visit[ans[1]]=1;
for(i=2;i<=N;i++)
for(j=1;j<=N;j++)
{
if(visit[j]==0)
{
ans[i]--;
if(ans[i]==0)
{
printf(" %d",j);
visit[j]=1;
break;
}
}
}
printf("\n");
}
int main()
{
int i,j,k,x;
scanf("%d",&K);
memset(dp,0,sizeof(dp));
dp[1][1][0]=1;
dp[1][1][1]=1;
for(j=2;j<=20;j++)
{
for(i=1;i<=j;i++)
{
for(x=i;x<=j-1;x++)
dp[i][j][0]+=dp[x][j-1][1];
for(x=1;x<i;x++)
dp[i][j][1]+=dp[x][j-1][0];
}
}
while(K--)
{
scanf("%d%lld",&N,&C);
memset(ans,0,sizeof(ans));
memset(visit,0,sizeof(visit));
sum=C;
pan(N);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator