USACO-Stringsobits(动归求组合数 )

来源:互联网 发布:野孩子 知乎 编辑:程序博客网 时间:2024/06/01 09:24

题目链接:USACO-Stringsobits

Cji=Cji1+Cj1i1

然后从高到底枚举n位数的所有位数。
因为当前位是1的数肯定大于当前位是0的所有数。
所以可以算出第n位是0的数的数量 x ,设当前还剩下 r 个1没有分配 。
那么
x=Crn1+Cr1n1+Cr2n1+......C0n1

如果找的是第k小数,若 k<=x ,则当前位是0,
否则当前位是1,且 k=x

/*ID: xdujlx1PROG: kimbitsLANG: 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;}
0 0
原创粉丝点击