计数类DP
正难则反
求出答案的补集
就是动态规划用一个伪前缀和优化就行了
#include<bits/stdc++.h>
using namespace std;
typedef int INT;
#define int long long
const int N=1e6+10;
int n,m,k;
const int mod=1e9+7;
int f[N]={};
int sum=0;
int quick_pow(int x,int k){
int ret=1;
while(k){
if(k%2==1){
ret=ret*x%mod;
}
x=x*x%mod;
k/=2;
}
return ret;
}
INT main(){
cin>>n>>m>>k;
f[0]=1;
for(int i=1;i<k;i++){
f[i]=f[i-1]*m%mod;
sum+=f[i];
sum%=mod;
}
for(int i=k;i<=n;i++){
f[i]=sum*(m-1)%mod;
sum-=f[i-k+1];
sum+=f[i];
sum=(sum+mod)%mod;
}
cout<<((quick_pow(m,n)-f[n])+mod)%mod;
}