演算法訓練 K好數 解析

2021-07-30 02:58:02 字數 1142 閱讀 2850

演算法訓練 k好數

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

提交此題 錦囊1 錦囊2

問題描述

如果乙個自然數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,我信了;

dp策略就是從區域性到整體,dp[i][j]代表的是位長為i,並且首位是j時狀態的總方案數,那麼如何用dp[i-1]推到dp[i]呢?

策略如下:由題意得兩個相鄰位數其值不想鄰,我們只需要剔除這種情況即可;

打個比方:設k=3,l=3 如何表示長度為3的方案數呢?

我們得到下面等式:總方案數由下面相加:dp[3][0],dp[3][1],dp[3][2]

並且:

dp[3][0]=dp[2][2]

dp[3][1]=0

dp[3][2]=dp[2][0]

我們決定長度為3時的首位數,然後剔除相鄰的情況,拓展到長度為2的情況;

#include 

#include

using

namespace

std;

#define mod 1000000007

int dp[105][105];

int main()

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

for(int j=0;jfor(int m=0;mif(j!=m+1&&j!=m-1)

}int sum=0;

for(int i=1;icout

0;}

演算法訓練 K好數

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

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