藍橋 演算法訓練 ALGO 3 K好數 數字DP

2021-10-09 18:30:49 字數 1645 閱讀 2306

題目鏈結

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

1 <= k, l <= 100

**和題解中的 n 和 m 分別對應 l 和 k。

狀態設計為:dp[i][k] 表示選到第 i 位選數字 k 時的情況,狀態轉移方程為:

d p[

1][j

]=1,

j∈[0

,m).

dp[i

][j]

=∑kk

≠j+1

,k≠j

−1dp

[i−1

][k]

dp[1][j] = 1, j∈[0,m)\\ .\\ dp[i][j]=\sum_k^

dp[1][

j]=1

,j∈[

0,m)

.dp[

i][j

]=k∑

k​=

j+1,

k​=

j−1​

dp[i

−1][

k]所以最終答案就是:∑k=

1mdp

[n][

k]

\sum_^

∑k=1m​

dp[n

][k]

,k 為什麼不是從 0 開始呢,因為要保證最高位不為 0 (我們已經將dp[1][0] = 1了所以 n 就是最高位)。

#include

#include

#include

#include

#include

#include

//#include

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#pragma gcc optimize(2)

using

namespace std;

typedef

long

long ll;

//cout << fixed << setprecision(2);

//cout << setw(2);

const

int n =

1e2+

6, m =

1000000007

;ll dp[n]

[n];

intmain()

}}} ll ans =0;

for(

int i =

1; i < m; i++

)//最高位不能為0

ans =

(ans + dp[n]

[i])

% m;

cout << ans <<

'\n'

;return0;

}

藍橋杯 演算法訓練 ALGO 3 K好數

思路 l位k進製,都是100 的數量級,暴力肯定直接pass,規律,尋不到 尋得到的 都是大神 認真分析,對於每一位數,如果不是最高位,那麼都可以用0到k 1這k個數來填充這一位,對於填充的每一位,我們假定已經知道如果這一位填充它的話,那麼好數會有f i j 個 i表示第i位,j表示填的數 那麼 我...

藍橋 ALGO 3 K好數

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

藍橋杯 ALGO 3 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個。由於這個數目...