涂色游戏

Description

在一个1*N的格子上,每个格子可以选择涂成红色或蓝色。 求至少 M 个连续为红色的方案数。

Input

多组输入,每组输入包含两个整数M和N  (0<N,M<100000)

Output

输出存在至少连续M个为红色的方案数,对1000000007取模

Sample Input

3 4

Sample Output

3

这道题有点意思,基本就是核电站问题的翻版

基本思路就是,还是和核电站一样,要考虑前几个格子避免连续n个红格子的思路

嗯,忘了刚才那句吧,我再说一遍

f[i]请参见核电站对f数组的定义

而q[i]就是这次前i个 (里面至少 M 个连续为红色)的方案数

q[i]=q[i-1]*2(这里就是指在第i个涂红还是不涂红)+f[i-m-1](考虑到i-m+1到i全涂红的方案数)

#include<iostream>
#include <stdio.h>
#include <math.h>
#include<stdio.h>
#include<string.h>
using namespace std;
 const int MOD=1e9+7;
int main()
{
     long long  f[100000];int i,n,m;
     long long  g[100000];
    int number;
    while(scanf("%d%d",&m,&n)!=EOF)
    {	 memset(f,0,sizeof(f));
		 memset(g, 0,sizeof(g));
		f[0]=1;
	    for(i=1;i<=n;i++)
	    {
	    	 if(i<m)
			 {
			 	f[i]=2*f[i-1];
			 	f[i]%=MOD;
			 	g[i]=0;
			 }
   		 	 if(i==m)
			 {
				 	f[i]=2*f[i-1]-1;
				 	f[i]%=MOD;
				 	g[i]=1;
			 }
    	if(i>m)
		 {
			 f[i]=2*f[i-1]-f[i-m-1]+MOD;
		 	f[i]=f[i]%MOD;
			g[i]=2*g[i-1]+f[i-m-1]+MOD;
			g[i]=g[i]%MOD;

		 }

	}
	 for(i=1;i<=n;i++)
    {
    	printf(" g[%d]=%d  f[%d]=%d \n",i,g[i],i,f[i]);
	}
   cout<<g[n]%1000000007<<endl;
//	cout<<" "<<m+n<<endl;
	}

    return 0;
    }

  

涂色游戏

时间: 2024-11-12 00:28:30

涂色游戏的相关文章

hdu 4559 涂色游戏(SG)

在一个2*N的格子上染色 每次可以染1*1的格子 或者2*2的格子 最涂满所有格子的人胜 m为已染色格子的个数 Alice先手 1*1的点SG值为1 SG[i]表示连续2*i的SG值 sg[3] 就是连续2*3空白格子 假如n = 3 涂一个1*1个格子的情况 那么后继状态就可能是 状态1 连续0列的格子+连续2列的格子+剩余那一列涂1个格子状态2 连续1列的格子+连续1列的格子+剩余那一列涂1个格子 涂一个2*3个格子的情况 那么后继状态就可能是 状态1 连续0列的格子+连续1列的格子+剩余的

涂色游戏 题解

bsoj6412 没找到出处... 题意简述:给一颗树,一次操作定义为随机选择一个点,染掉该点和它周围一圈的点,问期望多少次染黑所有点. 这是道好题啊!全面考察了容斥.反演.期望和dp,有许多值得注意的细节. 一.做法1(容斥/二项式反演+dp) 1.1 化式子 首先肯定第一个想到的式子就是 \[ Ans = \sum_{i=1}^{\infty} i * P(在染第i次时刚好黑完) \] 这是根据期望的定义直接得到的. 然后发现这个\(i\)实在是非常的恶心,因为它居然和无穷有关.但既然是一个

BZOJ 1260 [CQOI2007]涂色paint(区间DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1260 [题目大意] 假设你有一条长度为n的木版,初始时没有涂过任何颜色 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色 求最少的涂色次数达到目标状态 [题解] dp[i][j]表示涂抹i到j的最优答案, 显然当i和j相同时,可以从i+1……j,i……j-1,i+1……j-1转移过来, 同时也可以从两个区间组合得到. [代码] #include <cstdio>

POJ 1129 Channel Allocation(暴力搜--涂色问题)

Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13295   Accepted: 6806 Description When a radio station is broadcasting over a very large area, repeaters are used to retransmit the signal so that every receiver has a s

BZOJ 1260: [CQOI2007]涂色paint( 区间dp )

区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] == s[ l + 1 ] 则 dp( l , r ) = dp( l + 1 , r )     s[ r ] == s[ r - 1 ] 则 dp( l , r ) = dp( l , r - 1 )  因为只要在涂色时多涂一格就行了, 显然相等 , 所以转移一下之后更好做 s[ l ] == s

HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&amp;快速幂取模)

题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了. 以左上角的下半角为例.共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记录,即每输入一个涂过色的格子的坐标我们就在这个三角形里找与之对应的坐标,用vis[][]数组标记是否已经计

BZOJ 1260: [CQOI2007]涂色paint【区间DP】

Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色.例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标. 用尽量少的涂色次数达到目标. Input 输入仅一行,包含一个长度为n的字符串,即涂色目标.字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字

2014ACM/ICPC亚洲区北京站-重现赛 [B.Black And White] 涂色DFS

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题目大意:在一个N * M的棋盘里涂色,要求i颜色要涂ci次.ci求和为N * M. 关键思想:从第一个点开始着色,一行一行涂,注意一旦找到答案后面就不必搜,当剩下个数为n时若有种颜色>n/2上取整就不必搜了(!). #include <iostream> #include <iomanip> #include <cstdio> #include <cst

【DP】BZOJ 1260: [CQOI2007]涂色paint

1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 893  Solved: 540[Submit][Status][Discuss] Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色.例如第一次把木版涂成R