(一到普通的dp , 整了好久才AC。。dp只记录个数,输出时需要逻辑 。。
__int64 dp[22][22][2];
int ans[22];
int vis[22];
void init()
{
memset(dp, 0, sizeof(dp));
dp[1][1][0] = 1;
dp[1][1][1] = 1;
for(int i=2; i<=20; i++)
{
for(int j=1; j<=i; j++)
{
for(int k=1; k<j; k++)
dp[i][j][1] += dp[i-1][k][0];
for(int k=j; k<i; k++)
dp[i][j][0] += dp[i-1][k][1];
}
}
}
int main()
{
int t, n;
__int64 C;
init();
scanf("%d", &t);
while(t--)
{
memset(vis, 0, sizeof(vis));
scanf("%d%I64d", &n, &C);
int i, tmp = 2, ii=1;
while(n)
{
for( i = ii; ; i++)
{
if(tmp!=1)
{
//cout<<n<<' '<<i<<" 1 "<<dp[n][i][1]<<' '<<C<<endl;
if( C>dp[n][i][1] ) C -= dp[n][i][1];
else { tmp = 1; ii = 1;break;}
}
if(tmp!=0)
{
//cout<<n<<' '<<i<<" 0 "<<dp[n][i][0]<<' '<<C<<endl;
if( C>dp[n][i][0] ) C -= dp[n][i][0];
else { tmp = 0; ii = i; break;}
}
}
int j, k;
for(j=1, k=1; j<=i; k++)
{
if(j==i && !vis[k]) break;
if(!vis[k]) j++;
}
n--;vis[k] = 1;
printf("%d ", k);
}
printf("\n");
}
return 0;
}