很快就發(fā)現(xiàn)了這題的遞推特性。簡直是赤裸裸啊~ 定義一個(gè)數(shù)組( [串長度][串中'1'的個(gè)數(shù)]=種類數(shù) )這就是一個(gè)排列啊~ 用一個(gè)簡單的遞推方程求解出來C(n,i)=C(n-1,i)C(n-1,i-1); 然后從首位n開始判斷,∑C[n-1][i] ( i∈[0,l] ) 若和大于等于當(dāng)前的第k個(gè)數(shù)則說明
很快就發(fā)現(xiàn)了這題的遞推特性。簡直是赤裸裸啊~
定義一個(gè)數(shù)組( [串長度][串中'1'的個(gè)數(shù)]=種類數(shù) )這就是一個(gè)排列啊~
用一個(gè)簡單的遞推方程求解出來C(n,i)=C(n-1,i)+C(n-1,i-1);
然后從首位n開始判斷,∑C[n-1][i] ( i∈[0,l] )
若和大于等于當(dāng)前的第k個(gè)數(shù)則說明,右邊的n-1位足夠提供題中所需的數(shù)量,因此當(dāng)前位為'0';
若右邊n-1位不能提供所需的數(shù)量,則當(dāng)前位為'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
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com