题目
https://www.luogu.org/problemnew/show/P2727
思路
设f[i][j]为前i个,1的个数<=j的方案数
递推式显然是f[i][j]=f[i-1][j-1]+f[i-1][j]
然后就是判断排名第K的
若我们要确定第i位,若f[i]<k那么输出1
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=40;
int n,l;
long long rank,f[maxn][maxn];
int main()
{
scanf("%d%d%lld",&n,&l,&rank);
for(int i=0; i<=n; i++) f[i][0]=1;
for(int i=0; i<=l; i++) f[0][i]=1;
for(int i=1; i<=n; i++) for(int j=1; j<=l; j++) f[i][j]=f[i-1][j]+f[i-1][j-1];
for(int i=n-1; i>=0; i--)
{
if(rank>f[i][l])
{
printf("1"); rank-=f[i][l]; l--;
}else printf("0");
}
}