藍橋杯備賽 演算法訓練 K好數

2021-09-11 17:41:37 字數 1223 閱讀 1381

問題描述

如果乙個自然數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樣例輸出

7資料規模與約定

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

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

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

這個題有點難度,花了我一天的時間去想,結合別人的部落格,我來分析一下吧:

首先定義乙個dp[ i ] [ j ] 代表第 i 位 以 j 開頭的情況個數 比如dp[ 1 ][ 1 ] 代表第一位 以1開頭 顯然dp[ 1 ][ 1 ]=1 因為長度為1 所以只有 1 本身這個情況 。好,我們繼續分析:

首先,先考慮只有1位數的情況 dp[ 1 ][ j ]=1 (0<=j<=k-1) 然後往高位數求核心**如下:

i 代表第幾位數 假設此時我們的 i 為2 j=1時 代表以1開頭的兩位數 我們的個位可以取1和3

那麼 dp[ 2 ][ 1 ]=2 同理,繼續往高位求就可以了得出結果了 然後考慮一下 j 和 x 是不相鄰的條件

for

(int i=

2;i<=len;i++)}

}}

#include

#include

using namespace std;

#define mod 1000000007;

const

int maxn=

100+8;

int dp[maxn]

[maxn]

;int

main()

for(

int i=

2;i<=len;i++)}

}}int sum=0;

for(

int j=

1;j) cout<

return0;

}

學如逆水行舟,不進則退

演算法訓練 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個。由於這個數目...

藍橋杯 演算法訓練 K好數

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

藍橋杯演算法訓練 K好數

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