2 k進製數

2022-03-27 06:22:15 字數 1765 閱讀 7527

發現自己推得組合數好像不太一樣

先把這個複雜的柿子寫一遍

\[\sum_^\right \rfloor}c_^+\sum_^ \text \textk}-1}c_^\right \rfloor}

\]感覺這個柿子非常蛇皮

但是非常好求啊

由於\(2^k-1\)非常小,最大僅僅是\(511\),所以我們沒有什麼必要預處理階乘,我們可以直接用組合數遞推的方式來做

於是不需要打高精除或者高精乘了,乙個高精加就夠了

於是做法就非常無腦了,重要的是這個柿子是怎麼推出來的

首先我們先考慮乙個非常弱化的版本,就是\(k|n\)

如果\(k|n\)的話,**那麼這個長度為\(n\)的二進位制數就能被恰好分成\(n/k\)個塊,而且每乙個塊能選擇的數都是\(0\)到\(2^k-1\)這\(2^k\)個數

**我們發現\(0\)這個非常不好考慮,於是我們可以先忽略掉\(0\)

所以現在有\(n/k\)個塊,每個塊內能填\(2^k-1\)種數

那麼就有\(c_^\)種可能

之後我們再來考慮\(0\)的情況,首先最高位(如果不是第二位的話)是可以填\(0\)的,而剩下的\(n/k-1\)個塊我們仍舊按照之前的方式來填,於是就有\(c_^\),之後對於次高位還是可以填\(0\)(同時最高位也填\(0\)),那麼還有\(n/k-2\)個塊,於是就是\(c_^\)

以此類推,直到對於第三個的塊,我們還是可以填將這個塊以及之前所有的塊都填\(0\),那麼就還有\(2\)個塊,於是就是\(c_^\)

而第二個塊可是不能填\(0\)了,於是就沒了

所以對於\(k|n\)的時候,答案就是

\[\sum_^c_^

\]之後我們再來考慮一下\(k\)不整除\(n\)的情況

這個樣子的話一共會分成\(\left \lfloor\frac\right \rfloor+1\)個塊,\(\left \lfloor\frac\right \rfloor\)個塊內可以選擇的數都是\(0\)到\(2^k-1\)這\(2^k\)個數,而最後乙個不完整的塊只有\(n\text \text \textk\)位,所以能選擇的數只有\(0\)到\(2^ \text \textk}-1\)

如果這個最高位選擇填\(0\)那麼退化成了\(k|n\)的情況,所以最高位填0的方案數為

\[\sum_^\right \rfloor}c_^

\]之後最高位還有\(1\)到\(2^ \text \textk}-1\)這些數可以填,如果我們選擇填\(i\)的話,那麼剩下的塊內就不能填比\(i\)小的數,於是剩下的每個塊內能選擇的就有\(2^k-1-i\)個數,所以方案數就是\(c_^\right \rfloor}\)

所以最後的答案還應該加上

\[\sum_^ \text \textk}-1}c_^\right \rfloor}

\]**

#include#include#include#include#define re register

#define maxn 512

using namespace std;

string c[maxn][maxn];

int n,k;

int p,t;

int res;

int aa[201],bb[201],cc[201];

inline string sum(string a,string b)

int pp=(1ans=sum(ans,c[t-1-i][p]);

} cout

}

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進製數(藍橋杯)

思路 首先就是理解題意,這道題我看了一天了,現在還是沒整出來,錯誤50 可能是中間產生溢位了。這是一道組合題,重點就是最高位的選取,我們分成兩種情況來考慮 if m錯誤50 待更 更新 就是沒有注意寫的組合數函式還必須滿足的乙個條件 m n include include includeusing ...