題目鏈結
如果乙個自然數 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個。由於這個數目...