这道题又是看了题解。
思想大概是:我们枚举到i位数有j个1,用杨辉三角形求组合数,第i行第j列就是C(i-1,j-1),用sum[i][j]表示i位数0..j个1的所有的数的个数,那么sum[i][j]=C(i,0)+C(i,1)+......+C(i,j),那么当我们求第k个数时,当sum[i-1][j](i-1位数,0...j个1的方案数)<k时,意味着第i位是1,否则是0,以此类推。
/* ID:abc31261 LANG:C++ TASK:kimbits */ #include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=50; long long sum,f[maxn][maxn],n,k,l; int main() { int i,j; freopen("kimbits.in","r",stdin); freopen("kimbits.out","w",stdout); cin>>n>>l>>k; f[0][0]=1; for (i=1;i<=n;i++) for (j=1;j<=n;j++)f[i][j]=f[i-1][j-1]+f[i-1][j];//杨辉三角形 for (i=n;i>=1;i--) { if (l==0)printf("0"); else { sum=0; for (j=1;j<=l+1;j++)sum+=f[i][j]; //杨辉三角形从1开始的话第i行第j列是C(i-1,j-1); if (sum>=k)printf("0"); else { printf("1"); k-=sum; //减去第i位是0的方案数 l--; } } } cout<<endl; return 0; }