演算法訓練 K好數

2021-07-26 14:00:07 字數 1173 閱讀 8778

問題描述

如果乙個自然數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,k進製是乙個範圍,dp[i][j]表示k進製時,i位數時以j結尾(以j開頭也可以)的k好數的數數量,

初始化的時候一位數時無論是什麼數一定是k好數,所以dp[1][j]=1,範圍j<=k;

動態規劃的時候,我理解的是當討論i位

數時,我們要從第i-1位數開始討論,模擬第i-1位數的值,再模擬第i位數的值,只有在第i-1位數和第i位數不相鄰時

才屬於dp[i][j],加上dp[i-1][k](這麼理解,就是i-1位數結尾為數字k時第i位數字j與k不相鄰,那麼就把j加在後面,

此時的i位數就是dp[i-1][k]種情況,依次模仿討論相加各種情況)

#include#include#include#includeusing namespace std;

const int mod = 1000000007;

long long int dp[110][110];

long long int sum;

int main()

{ int l,k;

memset(dp,0,sizeof(dp));

scanf("%d%d",&k,&l);

for(int i=0; i<=k-1; i++)

dp[1][i] = 1;

for(int i=2; i<=l; i++)

{ for(int j=0; j

演算法訓練 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好數

演算法訓練 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好數

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