题目链接:USACO-Stringsobits
Cji=Cji−1+Cj−1i−1
然后从高到底枚举n位数的所有位数。
因为当前位是1的数肯定大于当前位是0的所有数。
所以可以算出第n位是0的数的数量 x ,设当前还剩下
那么
x=Crn−1+Cr−1n−1+Cr−2n−1+......C0n−1
如果找的是第k小数,若 k<=x ,则当前位是0,
否则当前位是1,且 k−=x 。
/*
ID: xdujlx1
PROG: kimbits
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll C[32][32];
void ioinit()
{
freopen("kimbits.in","r",stdin);
freopen("kimbits.out","w",stdout);
}
int main()
{
ioinit();
for(int i=0;i<32;i++)
{
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
ll n,l,k;
cin>>n>>l>>k;
string s;
for(int i=n;i>=1;i--)
{
ll x=0;
for(int j=0;j<=l;j++)
x+=C[i-1][j];
if(k<=x) s.push_back('0');
else
{
s.push_back('1');
k-=x;
--l;
}
}
cout<<s<<endl;
return 0;
}