AT_abc279_g题解
有点妙的 dp,感觉和大家的有点不同。
首先我们有个朴素的 dp,设
(第
(如果第
直接做是
发现第一部分可以直接继承,于是可以把第一维省掉。
直接用前缀和算第二部分,代码中的
注意
这题就做完了。
代码真的很短。
int main(){
scanf("%lld %lld %lld",&n,&K,&c);
f[1]=g[1]=c;
for(R i=2; i<=n; ++i){
LL x=max(i-K+1,(LL)1);
f[i]=g[i-1]-g[x]+g[x]*(c-1)%mo;//唯一的转移
f[i]=(f[i]+mo)%mo;
g[i]=(g[i-1]+f[i])%mo;
}
printf("%lld\n",g[n]);
}
如有错请指出,谢谢。