K好數 藍橋杯

2021-10-07 19:08:58 字數 1340 閱讀 4957

資源限制

時間限制:1.0s   記憶體限制:256.0mb

問題描述

如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k = 4,l = 2的時候,所有k好數為11、13、20、22、30、31、33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。

輸入格式

輸入包含兩個正整數,k和l。

輸出格式

輸出乙個整數,表示答案對1000000007取模後的值。

樣例輸入

4 2樣例輸出

資料規模與約定

對於30%的資料,kl <= 106;

對於50%的資料,k <= 16, l <= 10;

對於100%的資料,1 <= k,l <= 100。

了解到網上很多人都對這道演算法題感興趣,但是網上很多解答都不太清晰(可以試試看看我這個,我將用最白話的方式解答)

動態規劃的dp方程可設計為dp[i][j]=dp[i-1][k](代表第i為j的滿足條件的個數,意思就是在i-1行資料已經填好的情況下,即已經知道i-1個數的k進製數,以任意(0-k-1)個數開頭的個數情況,然後將滿足條件的數求和即可),這裡需要注意一下,我們每次新增的這個數可以理解為新增到這個i-1位數的開頭

初始化第一行為1,因為任意進製的數,我們預設長度為1的只有一種(包括0,dp[0][0]=1,這裡可能有人會疑惑,為什麼這裡也初始化為0,因為計算後面的行,我們可以在0前面新增資料,就符合題意了,並且,首位為零的數,對我們後面計算答案沒有影響,這裡往後面看就懂了)

例如,用5   3  進行測試,即5進製,長度為3位,最後dp表的構成為

此時答案應該為dp[2][1]+dp[2][2]+dp[2][3]+dp[2][4]=45  ,為什麼不用加dp[2][0],因為根據示例,當l大於1的時候,我們認為0開頭的數字不符合題意(dp[0][m],這個資料的意思是已0開頭的資料種數)

public static void main(string args) {

scanner sc = new scanner(system.in);

int k = sc.nextint();

int l = sc.nextint();

int dp = new int[l][k];

//初始化第一行資料

藍橋杯 K好數

演算法訓練 k好數 問題描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值...

k好數 (藍橋杯)

時間限制 1 sec 記憶體限制 128 mb 提交 22 解決 3 提交 狀態 討論版 題目描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33...

藍橋杯 K好數

演算法訓練 k好數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目...