很快就發現了這題的遞推特性。簡直是赤裸裸啊~ 定義一個數組( [串長度][串中'1'的個數]=種類數 )這就是一個排列啊~ 用一個簡單的遞推方程求解出來C(n,i)=C(n-1,i)C(n-1,i-1); 然后從首位n開始判斷,∑C[n-1][i] ( i∈[0,l] ) 若和大于等于當前的第k個數則說明
很快就發現了這題的遞推特性。簡直是赤裸裸啊~
定義一個數組( [串長度][串中'1'的個數]=種類數 )這就是一個排列啊~
用一個簡單的遞推方程求解出來C(n,i)=C(n-1,i)+C(n-1,i-1);
然后從首位n開始判斷,∑C[n-1][i] ( i∈[0,l] )
若和大于等于當前的第k個數則說明,右邊的n-1位足夠提供題中所需的數量,因此當前位為'0';
若右邊n-1位不能提供所需的數量,則當前位為'1',右邊必須向n借一位,這樣k-=cnt;把右邊的和減去。提供的l--;
蠻有意思的一題:
Code:
/* ID:bysen LANG:C++ PROG:kimbits */ #includeusing namespace std; int C[32][32]; int main() { freopen( "kimbits.in","r",stdin ); freopen( "kimbits.out","w",stdout ); int n,l; long long k; scanf( "%d %d %lld",&n,&l,&k ); for( int i=0;i<32;i++ ) for( int j=0;j<32;j++ ) C[i][j]=0; for( int i=0;i<32;i++ ) C[i][0]=1; for( int i=1;i<32;i++ ) for( int j=1;j<32;j++ ) C[j][i]=C[j-1][i]+C[j-1][i-1]; for( int i=n;i>=1;i-- ) { int cnt=0; for( int j=0;j<=l;j++ ) cnt+=C[i-1][j]; if( cnt
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com