題目描述
給你m個不同數字,然後用這些數字組成長度為n的序列,且保證至少有長度》=k的一段相同數字的方案數。
輸入3個整數n,m,k
輸出一行,輸出的答案值mod 109+7109+7
樣例輸入
3 2 2
樣例輸出6提示
【資料規模】
70%:n,k<=1000n,k<=1000
100%資料:1<=n,m,k<=106
analysis
突然發現自己好毒瘤啊……
全機房都在刷網路流和圖論……我卻在這裡搞dp……
啊啊……不管了不管了,菜雞要從基礎做起
這道題,一眼組合數學
推了半天,並沒有結果
如果要統計長度》=k的方案數,直接統計的話並不容易維護
那麼這時我們就需要啟用正難則反的思想了(又名補集思想)
我們定義dp[i]表示到第 i 位,不滿足條件(也就是相同數字長度i
dp[i ]=mi iidp[i ]=mi ,當 i >=k i >=k i>=k 時,列舉最後一位相同數字的長度進行轉移(應該是1~k-1),那麼dp[ i]=σ dp[i −j]∗ (m−1 )dp[i]=\sigma dp[i-j] *(m-1) dp[i]= σdp[ i−j] ∗(m− 1)最後用字首和優化一下,就可以從o(n 2)−− >o( n) o(n^2)-->o(n) o(n2)− −>o( n)code#include
#define re register
#define p 1000000007
#define ll long long
using
namespace std;
const
int n=
1e6+10;
int m,n,k;
ll pre[n]
,f[n]
,sum=0;
intmain()
ll ans=1;
for(re int i=
1;i<=n;
++i) ans=
(ans*m)
%p; cout<<
((ans-f[n]
)%p+p)
%p;return0;
}
統計硬幣 dp
problem description 假設一堆由1分 2分 5分組成的n個硬幣總面值為m分,求一共有多少種可能的組合方式 某種面值的硬幣可以數量可以為0 input 輸入資料第一行有乙個正整數t,表示有t組測試資料 接下來的t行,每行有兩個數n,m,n和m的含義同上。output 對於每組測試資料...
3295 括號序列 (序列DP)
描述 給定一串字串,只由 四個字元構成。現在讓你盡量少的新增括號,得到乙個規則的序列。例如 都是規則的序列。這幾個不是規則的,如 輸入 輸入有多組測試資料。輸入一串字串序列,長度不大於255。輸出 輸出最少新增的括號數目。樣例輸入 樣例輸出 題目 椒江校區第一屆c語言程式設計大賽 這個題是問需要新增...
擺動序列(DP)
演算法訓練 擺動序列 時間限制 1.0s 記憶體限制 512.0mb 問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1...