2k進製數(codevs 1157)

2022-05-14 18:30:05 字數 1692 閱讀 6037

題目描述 description

設r是個2k進製數,並滿足以下條件:

(1)r至少是個2位的2k進製數。

(2)作為2k進製數,除最後一位外,r的每一位嚴格小於它右邊相鄰的那一位。

(3)將r轉換為2進製數q後,則q的總位數不超過w。

在這裡,正整數k(1≤k≤9)和w(k≤30000)是事先給定的。

問:滿足上述條件的不同的r共有多少個?

我們再從另一角度作些解釋:設s是長度為w 的01字串(即字串s由w個「0」或「1」組成),s對應於上述條件(3)中的q。將s從右起劃分為若干個長度為k 的段,每段對應一位2k進製的數,如果s至少可分成2段,則s所對應的二進位制數又可以轉換為上述的2k進製數r。

例:設k=3,w=7。則r是個八進位制數(23=8)。由於w=7,長度為7的01字串按3位一段分,可分為3段(即1,3,3,左邊第一段只有乙個二進位制位),則滿足條件的八進位制數有:

2位數:高位為1:6個(即12,13,14,15,16,17),高位為2:5個,…,高位為6:1個(即67)。共6+5+…+1=21個。

3位數:高位只能是1,第2位為2:5個(即123,124,125,126,127),第2位為3:4個,…,第2位為6:1個(即167)。共5+4+…+1=15個。

所以,滿足要求的r共有36個。

輸入描述 input description

只有1行,為兩個正整數,用乙個空格隔開:

k w輸出描述 output description

共1行,是乙個正整數,為所求的計算結果,即滿足條件的不同的r的個數(用十進位制數表示),要求最高位不得為0,各數字之間不得插入數字以外的其他字元(例如空格、換行符、逗號等)。

樣例輸入 sample input

3 7樣例輸出 sample output

/*

楊輝三角

強力爆空間,只能用char型別了

*/#include

#include

#include

#define m 600

using

namespace

std;

intk,w;

struct

node

};node ans,c[m][m];

node jia(node x,node y)

if(de.ch[de.len+1]!=0)de.len++;

return

de;}

int poww(int a,int

b)

returnr;}

void

init()

else c[i][j]=jia(c[i-1][j],c[i-1][j-1

]);}

intmain()

if(w%k!=0

)

for(int i=2;i<=n;i++)

if(i!=n) ans=jia(ans,c[poww(2,k)-1

][i]);

else

if(!yu) ans=jia(ans,c[poww(2,k)-1

][n]);

else

if(yu)

for(int i=ans.len;i>=1;i--)

printf("%d

",ans.ch[i]);

return0;

}

view code

2 k進製數

遞推 高精度 f i j 表示共i位且最高位是j的方案數,顯然有只要上一位比它大就可以轉移,所以有f i j f i 1 j 1 f i 1 2 k i 1 也就是f i j f i j 1 f i 1 j 最後特判一下最後一段剩下的w k的就可以。注意高精 include using namesp...

2 k進製數

設 s 是長度為 w 的 01 串。從串的右邊開始,每 k 個字元分成一段 最後不夠 k 個字元的也分成一段 組成乙個小於 2 k 的數。然後這 left lceil frac right rceil 個數將組成乙個序列。若這個序列除去前導零後的長度不小於 2 且序列裡的數嚴格遞增,那麼 s 就是乙...

2 k進製數

發現自己推得組合數好像不太一樣 先把這個複雜的柿子寫一遍 sum right rfloor c sum text textk 1 c right rfloor 感覺這個柿子非常蛇皮 但是非常好求啊 由於 2 k 1 非常小,最大僅僅是 511 所以我們沒有什麼必要預處理階乘,我們可以直接用組合數遞推...