题意:一个一排
一道容斥 DP 题。
易知最后的纸上的颜色序列肯定会有至少连续
总方案数可以很快算出为
我们设
因此得到
最后记得快速幂取模即可。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 1e9
using namespace std;
const int maxn=1000010;
const long long mod=1000000007;
long long n,m,k,ans,f[maxn],sum;
long long power(long long a,long long b,long long p)
{
long long ans=1%p;
for(;b;b>>=1)
{
if(b&1)
ans=(ans*a)%p;
a=(a*a)%p;
}
return ans%p;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
ans=power(m,n,mod);
f[0]=1;
sum=0;
for(int i=1;i<k;i++)
{
f[i]=f[i-1]*m%mod;
sum=(sum+f[i])%mod;
}
for(int i=k;i<=n;i++)
{
f[i]=sum*(m-1)%mod;
sum=(sum+f[i]+mod-f[i-k+1])%mod;
}
ans=(ans+mod-f[n])%mod;
printf("%lld",ans%mod);
return 0;
}