传送门

其实本来想做组合数学的2333.

谁知道是道dpdpdp.

唉只能顺手做了


还是用真难则反的思想。

这题我们倒着考虑,只需要求出不合法方案数就行了。

这个显然是随便dpdpdp的。

f[i]f[i]f[i]表示到第iii个格子不合法的方案数。

那么有两种情况。

  1. i&lt;ki&lt;ki<k,则无论怎么当前格子染都不合法,f[i]=f[i−1]∗mf[i]=f[i-1]*mf[i]=f[i−1]∗m
  2. i≥ki\geq ki≥k,则从当前的格子向左染最多染到第i−k+1i-k+1i−k+1个格子,因此f[i]=(m−1)∑j=i−k+1i−1f[i]f[i]=(m-1)\sum _{j=i-k+1} ^{i-1}f[i]f[i]=(m−1)∑j=i−k+1i−1​f[i]

维护一个动态的前缀和来转移就行了。

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
typedef long long ll;
const int N=1e6+5,mod=1e9+7;
int n,m,k,f[N];
int main(){
	n=read(),m=read(),k=read();
	f[0]=1;
	int sum=0,ans=1;
	for(int i=1;i<=n;++i)ans=1ll*ans*m%mod;
	for(int i=1;i<=n;++i){
		if(i<k)f[i]=1ll*f[i-1]*m%mod;
		else f[i]=1ll*sum*(m-1)%mod;
		sum+=f[i];
		if(sum>=mod)sum-=mod;
		if(i>=k){
			sum-=f[i-k+1];
			if(sum<0)sum+=mod;
		}
	}
	ans-=f[n];
	if(ans<0)ans+=mod;
	cout<<ans;
	return 0;
}

2018.10.25 洛谷P4187 [USACO18JAN]Stamp Painting(计数dp)的更多相关文章

  1. 2018.10.29 洛谷P4129 [SHOI2006]仙人掌(仙人掌+高精度)

    传送门 显然求出每一个环的大小. Ans=∏i(siz[i]+1)Ans=\prod_i(siz[i]+1)Ans=∏i​(siz[i]+1) 注意用高精度存答案. 代码: #include<b ...

  2. 2018.10.27 洛谷P2915奶牛混合起来Mixed Up Cows(状压dp)

    传送门 状压dp入门题. 按照题意建一个图. 要求的就是合法的链的总数. 直接f[i][j]f[i][j]f[i][j]表示当前状态为jjj,下一位要跟iii连起来的方案数. 然后从没被选并且跟iii ...

  3. 2018.10.26 洛谷P4551 最长异或路径(01trie)

    传送门 直接把每个点到根节点的异或距离插入01trie. 然后枚举每个点在01trie上匹配来更新答案就行了. 代码: #include<iostream> #include<cst ...

  4. 2018.07.09 洛谷P2365 任务安排(线性dp)

    P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  5. 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)

    传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...

  6. 2018.10.25 bzoj3928: [Cerc2014] Outer space invaders(区间dp)

    传送门 区间dpdpdp好题. 首先肯定需要把坐标离散化. 然后在数轴上面区间dpdpdp. 对于当前区间,区间中最大的数一定会被选. 于是我们记f[i,j]f[i,j]f[i,j]表示所有左端点在i ...

  7. 洛谷P2523 [HAOI2011]Problem c(计数dp)

    题面 luogu 题解 首先,显然一个人实际位置只可能大于或等于编号 先考虑无解的情况 对于编号为\(i\),如果确认的人编号在\([i,n]\)中数量大于区间长度,那么就无解 记\(S[i]\)表示 ...

  8. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  9. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

随机推荐

  1. c# 记录内容到txt文件

    string a= content;//采样结果 if (!File.Exists("e:\\newfile\\newtxt.txt")) { new FileStream(&qu ...

  2. 33 【kebernetes】一个错误的解决方案

    在安装或者重新安装kubernetes时,我碰到了这个错误: Unable to update cni config: No networks found in /etc/cni/net.d/ 这个错 ...

  3. TCP/IP中的四元组、五元组、七元组

    四元组:源IP地址.目的IP地址.源端口.目的端口 五元组:源IP地址.目的IP地址.源端口.目的端口.传输层协议 七元组:源IP地址.目的IP地址.源端口.目的端口.传输层协议,服务类型以及接口索引

  4. Java_13.1.1 字符串的应用

    1获取一个字符串中,另一个字符串出现的次数 思想:      1. indexOf到字符串中到第一次出现的索引      2. 找到的索引+被找字符串长度,截取字符串       3. 计数器++ p ...

  5. js的urlencode

    function urlencode (str) { str = (str + '').toString(); return encodeURIComponent(str).replace(/!/g, ...

  6. pyton random 模块

    import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) #[1,3] 大 ...

  7. Linux ulimit

    一.简介   二.语法   三.其他 1)linux下进程的进程最大数.最大线程数.进程打开的文件数和ulimit命令修改硬件资源限制 http://blog.csdn.net/gatieme/art ...

  8. URLEncoder.encode转译后“空格”变“加号”的问题的解决方案

    我用dst_fname=URLEncoder.encode(dst_fname);对字符串dst_fname进行编码,但是发现空格全部都变成了加号,我们提需求的傻B非得要空格的,但是不编码有很多非常特 ...

  9. andorid 列表视图 ListView 之BaseAdapter

    .xml <?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android=&qu ...

  10. svn冲突问题解决办法

    经常有人会说,树冲突是很难解决的一类冲突,其实一旦了解了其原理,要解决也不难.先回顾下对于树冲突的定义.     树冲突:当一名开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行 ...