dotcpp1117 K 進製數 遞推

2021-10-04 07:34:02 字數 1388 閱讀 1939

考慮包含n位數字的k-進製數. 定義乙個數有效, 如果其k-進製表示不包含兩連續的0. 

例: 1010230 是有效的7位數 

1000198 無效 

0001235 不是7位數, 而是4位數. 

給定兩個數n和k, 要求計算包含n位數字的有效k-進製數的總數. 

假設2 <= k <= 10; 2 <= n; 4 <= n+k <= 18.

輸入

兩個十進位制整數n和k

輸出

十進位制表示的結果

樣例輸入

2

10

樣例輸出

90

拿到這個題看了一眼範圍,暴力應該會被t,但是我還是試了一發,結果被t的一發不可收拾!可是不暴力的話應該怎麼做呢?

其實這是乙個遞推的問題:

我們先看n=1的情況,顯然有 k-1 種情況符合條件,只有一種條件不符合情況,因為第一位為0 是不對的,我們記ac1=k-1,wa1=1;

當n=2的時候,需要和n=1的情況相聯絡,第二位的選項還是k-1種,滿足條件的情況分為兩部分,一部分是第一位滿足情況 k-1種,以及第一位不滿足的情況,所以ac2=(k-1)*(ac1+wa1);不滿足條件的情況就發生了改變,即在ac1 前面補0的情況,當然00必定不符合情況,以後也無法湊成滿足條件的,所以我們不需要考慮,即wa2=ac1

當n=3時,還是需要看n=2的情況,第三位的選項有 k-1種,因為第三位不會取到0,而也不會有00的情況,所以第三位仍然可以與ac2和wa2想匹配,即ac3=(k-1)*(ac2+wa2);不滿足的情況仍然是在ac2的前面補0,即 wa3=ac2

所以遞推式就出來嘍,ac=(k-1)*(preac+wa); wa=preac;我們求得最終的ac就可以ac了

**很簡單 :

#include#include#include#include#include#include#include#include#include#define ll long long

#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;

inline int _read()

const int inf=0x3f3f3f3f;

const int mm=0;

int main()

cout

}

問題 1117 K 進製數

考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.例 1010230 是有效的7位數 1000198 無效 0001235 不是7位數,而是4位數.給定兩個數n和k,要求計算包含n位數字...

題目 1117 K 進製數

題目的意思就乙個n位的k進製數中不能有2個及2個以上的0是相鄰的,問這樣的數一共有多少個 首位肯定不能為0,前面的數如果為0則後面的數可以是除了0以外的任意數,前面的數如果不為0則後面的數就可以為任意值。實現只不過是模擬上面的過程,用乙個標記指示某一位是不是為0,如果前一位是0,那當前這位就一種情況...

題目 1117 K 進製數

考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.例 1010230 是有效的7位數 1000198 無效 0001235 不是7位數,而是4位數.給定兩個數n和k,要求計算包含n位數字...