我们预处理一个数组dp[i][j]表明在i位二进制数里有j个1的二进制个数
然后,for i in [0, n],求出s=sum(F[i, 0~L])。如果这个和大于t,就说明我们要求的这个数字包含在num[k]=1里。把t扣除掉num[i]=0的情况,也就是扣掉s。
//usaco3-2-2 01串 #include<iostream> #include<cstdio> #include<cstring> #define ll long long ll dp[1010][1010]; int n,l; ll t; int num[51]; void dfs(int n,int l,ll t) { if (!t) return; ll cur,s=0; for (int i=0;i<=n;i++) { cur=s;s=0; for (int j=0;j<=l;j++) s+=dp[i][j]; if (s>=t) { num[i]=1; dfs(n-1,l-1,t-cur); break; } } } int main() { scanf("%d%d%lld",&n,&l,&t); for (int i=0;i<=n;i++) dp[i][0]=1; for (int i=1;i<=n;i++) for (int j=1;j<=l;j++) dp[i][j]=dp[i-1][j-1]+dp[i-1][j]; dfs(n,l,t); for (int i=n;i>=1;i--) if (num[i]) printf("1");else printf("0"); printf("\n"); return 0; }