题意:1和1不能相邻,找出第k小的长度为n的序列
0前面可以是0或者1,1前面只能是0 。 根据这一点可以写出递推公式:dp[i][0]=dp[i-1][0]+dp[i-1][1]; dp[i][1]=dp[i-1][0];
dp[i][0]记录末尾为0的序列的个数,dp[i][1]记录末尾为1的序列的个数。
每次编码的时候判断当前位是否可以为0,产生的排列数和k比较
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=50;
LL dp[N][2];
int n;
LL k;
int main()
{
memset(dp,0,sizeof(dp));
scanf("%d%lld",&n,&k);
dp[1][1]=dp[1][0]=1;
for(int i=2;i<44;i++)
{
dp[i][0]=dp[i-1][0]+dp[i-1][1];
dp[i][1]=dp[i-1][0];
}
if(k>dp[n][0]+dp[n][1])
{
printf("-1\n");
return 0;
}
while(n)
{
if(dp[n][0]>=k)
{
printf("0");
}
else
{
k-=dp[n][0];
printf("1");
}
n--;
}
printf("\n");
return 0;
}