zoukankan      html  css  js  c++  java
  • [USACO18JAN]Stamp Painting

    题目

    考虑正难则反,拿总方案数(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
    ",dqm(ans-dp[n]));
    	return 0;
    }
    
    
  • 相关阅读:
    Repeater使用二
    db2, oracle和sqlserver取前几行的语法
    AspNet 路径问题
    PL/Sql 中创建、调试、调用存储过程
    ORA错误编码
    PL/SQL 设置
    常用命令行
    SQL Server将单表数据导出成insert脚本形式
    获取Url链接内容
    Oracle安装注意事项
  • 原文地址:https://www.cnblogs.com/asuldb/p/11528942.html
Copyright © 2011-2022 走看看