题意:
N位二进制数1的个数不超过L个 求 第i个数是多少
思路:
一开始以为是用二进制暴力就行 事实证明我是213 - -b
这题就应该去构造 但是简单的用dfs构造然后计数还是会TLE 因此想到去组合
假如现在想求第k位是0还是1 可用的所有的1全在1~k-1位的种类数为x 如果x<n(想求第n个数)那么第k位一定是1
如此就可以先dp打一个杨辉三角的组合数表 然后根据不同位置形成的种类数判断0或1
可能我口语表达不是很好 看代码吧
代码:
/*
ID: housera1
PROG: kimbits
LANG: C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
unsigned int N,L,I;
unsigned int dp[40][40];
int main(){
int Debug=0;
if(!Debug){
freopen("kimbits.in","r",stdin);
freopen("kimbits.out","w",stdout);
}
int i,j;
scanf("%d%d%u",&N,&L,&I);
dp[0][0]=1;
dp[1][0]=dp[1][1]=1;
for(i=2;i<N;i++)
{
dp[i][0]=1;
for(j=1;j<=i;j++) dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
}
for(i=N-1;i>=0;i--)
{
for(j=1;j<=N;j++) dp[i][j]+=dp[i][j-1];
if(I>dp[i][L])
{
printf("1");
I-=dp[i][L];
L--;
}
else printf("0");
}
printf("\n");
return 0;
}