码迷,mamicode.com
首页 > 其他好文 > 详细

[USACO18JAN]Stamp Painting

时间:2019-09-16 19:37:40      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:define   register   tps   ble   print   org   长度   mat   clu   

题目

考虑正难则反,拿总方案数\(m^n\)减掉不合法的方案

由于我们最后一次涂了一段长度为\(k\)的连续颜色段,所以合法的方案有一段长度至少为\(k\)的颜色相同段

不合法的方案一定没有,于是我们求一下有多个颜色序列没有长度大于等于\(k\)的颜色相同段就好了

显然我们强制往后加一段长度小于\(k\)的段就行了

于是有\(f_i=(m-1)\sum_{j=i-k+1}^{i-1}f_j\),转移的时候维护一下前缀和就可以了

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
const int mod=1e9+7;
const int maxn=1e6+5;
int n,m,k,dp[maxn],pre[maxn];
inline int qm(int x) {return x>=mod?x-mod:x;}
inline int dqm(int x) {return x<0?x+mod:x;}
inline int calc(int l,int r) {return dqm(pre[r]-pre[l-1]);}
int main() {
    scanf("%d%d%d",&n,&m,&k);dp[0]=1;
    for(re int i=1;i<k;i++) dp[i]=1ll*dp[i-1]*m%mod,pre[i]=qm(pre[i-1]+dp[i]);
    for(re int i=k;i<=n;i++)
        dp[i]=1ll*(m-1)*calc(i-k+1,i-1)%mod,pre[i]=qm(pre[i-1]+dp[i]);
    int ans=1;for(re int i=1;i<=n;i++) ans=1ll*ans*m%mod;
    printf("%d\n",dqm(ans-dp[n]));
    return 0;
}

[USACO18JAN]Stamp Painting

标签:define   register   tps   ble   print   org   长度   mat   clu   

原文地址:https://www.cnblogs.com/asuldb/p/11528942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!