dp好理解,下面的输出第i打个数是在太巧妙了。dp[i][j]表示i位上1个数少于j的个数。
假设求第t大的数。
当t>dp[i-1][j]的时候,假如第i位是0后面怎么凑都出凑不到t个出来。如果第i位是1他肯定比第i位时0的dp[i-1][j]个数大所以我们只要再找t-dp[i][j]大的数就可以了以此类推
/*
ID: jinbo wu
LANG:C++
TASK:kimbits
*/
#include<bits/stdc++.h>
using namespace std;
int dp[35][35];
int main()
{
freopen("kimbits.in","r",stdin);
freopen("kimbits.out","w",stdout);
long long n,l,i;
cin>>n>>l>>i;
for(int j=0;j<=n;j++)
{
dp[j][0]=dp[0][j]=1;
}
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
dp[j][k]=dp[j-1][k-1]+dp[j-1][k];
for(int j=n;j>=1;j--)
{
if(i>dp[j-1][l])
{
cout<<1;
i-=dp[j-1][l];
l--;
}
else
cout<<0;
}
cout<<endl;
}