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

    LXIX.[USACO18JAN]Stamp Painting G

    思路:

    发现任何具有一段长度大于等于\(K\)的相同颜色区间的串都是合法的(这个区间被看作最后一次染色的目标)。

    因此反向思考,我们求出所有不具有长度大于等于\(k\)的相同颜色区间的串数量,然后用总数量(\(M^N\))减一下即可。

    我们设\(f[i]\)表示前\(i\)位的方案数。

    则有

    \(f[i]=\begin{cases}M^i(1\leq i<K)\\(\sum\limits_{j=i-K+1}^{i-1}f[j])(M-1)\end{cases}\)

    复杂度\(O(NK)\)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9+7;
    int n,m,p,f[1001000],res=1;
    int main(){
    	scanf("%d%d%d",&n,&m,&p);
    	f[0]=1;
    	for(int i=1;i<p;i++,res=(1ll*res*m)%mod)f[i]=(1ll*f[i-1]*m)%mod;
    	for(int i=p;i<=n;i++,res=(1ll*res*m)%mod){
    		for(int j=i-p+1;j<i;j++)(f[i]+=f[j])%=mod;
    		f[i]=1ll*f[i]*(m-1)%mod;
    	}
    //	for(int i=1;i<=n;i++)printf("%d ",f[i]);
    	printf("%d\n",(mod+res-f[n])%mod);
    	return 0;
    }
    

    然后套上前缀和,复杂度\(O(N)\)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9+7;
    int n,m,p,f[1001000],res=1,s[1001000];
    int main(){
    	scanf("%d%d%d",&n,&m,&p);
    	f[0]=1;
    	for(int i=1;i<p;i++,res=(1ll*res*m)%mod)f[i]=(1ll*f[i-1]*m)%mod,s[i]=(s[i-1]+f[i])%mod;
    	for(int i=p;i<=n;i++,res=(1ll*res*m)%mod)f[i]=1ll*(s[i-1]-s[i-p]+mod)%mod*(m-1)%mod,s[i]=(s[i-1]+f[i])%mod;
    	printf("%d\n",(mod+res-f[n])%mod);
    	return 0;
    }
    

  • 相关阅读:
    Ruby on Rails中的Rake教程(Rake如何把我灌醉!)
    十一、Spring Boot 集成Shiro和CAS
    Spring Boot 快速入门
    一位创业者的血泪史----献给85前创业者的反思
    罗振宇送给新员工的四句话
    Axure 入门
    XMind常用快捷方式汇总
    CAS 单点登陆
    mysql互换表中两列数据
    mysql默认安装目录说明
  • 原文地址:https://www.cnblogs.com/Troverld/p/14597593.html
Copyright © 2011-2022 走看看