題目描述 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
/*view code楊輝三角
強力爆空間,只能用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;
}
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 所以我們沒有什麼必要預處理階乘,我們可以直接用組合數遞推...