Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory

题目原址:C. Ivan the Fool and the Probability Theory

题意:n×m的网格中填黑白格,最多有两个相邻,共用一条边为相邻,有几种填法。

思路:这题比赛写自闭了,一直觉得自己的思路没错,然后就残酷打脸,超级难受的那种。

从不能有3个及以上相邻可以得出,只要有两个相邻的就能确定全部的分布,那就变成了求一行的方法数量,再减去黑白相间的两种,而剩下就是黑白相间两种情况时有多少种了。

一行的求法:dp[ i ] [ 0 ]表示在第 i 个格子里放白色的放法有多少,dp[ i ] [ 1 ] 表示在第 i 个格子里放黑色的放法有多少,显然dp [ 1 ] [ 0 ] = 1;dp [ 1 ] [ 1 ] = 1 ; dp [ 2 ] [ 0 ] = 2 ; dp [ 2 ] [ 1 ] = 2 ; 而接着就可以得到dp[ i ] [ 0 ] = dp [ i - 1 ] [ 1 ] + dp [ i - 2 ] [ 1 ] ; 第 i 个放白色那它前一个可以是放黑色,也可以前前个是放黑色,但不能前前前个,因为最多两个。后面的就是一样的。而黑色的推导是一样的,就能得到dp [ i ] = dp[ i - 1 ] + dp [ i - 2 ]。dp[ i ]表示有i个格子有几种放法。

接下来就会发现,列只有两种情况(先放黑块或先放白块,接着交替出现),可以把其中每一行都看成而第一个是相同颜色。就成了在一列n个格子里放黑白块,最多两个一样颜色相邻。

最后结果就是 dp [ n ] + dp [ m ] - 2 了。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 ll x,y;
 8 ll dp[100010];
 9 const ll MOD=1e9+7;
10 void ress(){
11     dp[1]=2;
12     dp[2]=4;
13     for(ll i=3;i<100010;i++)
14         dp[i]=(dp[i-1]+dp[i-2])%MOD;
15 }
16 void sol(){
17     ress();
18     ll ans=(dp[x] + dp[y]-2)%MOD;
19     cout<<ans;
20 }
21 int main(){
22     cin>>x>>y;
23     sol();
24     return 0;
25 }

原文地址:https://www.cnblogs.com/xunzf0402/p/11715785.html

时间: 2024-10-21 07:35:36

Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory的相关文章

Codeforces Round #594 (Div. 2)

Codeforces Round #594 (Div. 2) A. Integer Points 题意:给出若干个\(y = x + p\) 和 \(y = -x + q\) 求它们交点坐标为整数的个数 思路:\(y = x + p\) 与 \(y = -x + q\) 的交点为 \(\left(\frac{q - p}{2}, \frac{p + q}{2}\right)\) 即只用统计p和q数组中的奇偶数即可 AC代码 #include <algorithm> #include <i

Codeforces Round #594 (Div. 2) B C - Ivan the Fool and the Probability Theory

题目链接:https://codeforces.com/contest/1248/problem/C 赛后补的,已经有很详细的题解了,这里只作一个记录. 每相邻两行只可能完全相同或者完全不同,而每一行只有1010101010……和01010101010……是没有连续相邻的(有连续相邻的下一行只能完全不同,即有连续相邻的从第一行开始后面的就已经固定了),n=1时答案是递推数列,F[n] = F[n-1] + F[n-2].当第一行为10101010……或0101010101时每一行只有两种状态,此

Codeforces 1248 div2 C. Ivan the Fool and the Probability Theory (思维)

题意:给一个n×m的网格,只涂黑白,问再没有三个联通方格的情况下涂色,有多少种涂法?结果mod 1e9+7 直接说解法: 首先判断第一行的情况,做递推关系式F[ i ],F[ 1 ]显然为2,F[ 2 ]也可以任意,显然为4. 接下来F[ 3 ],需要分这个的前两个是否为连续相同的色块,如果是连续相同的色块,那么只能与前一个色块不同.我们把F[i]拓展为F[i][j],i表示到第几个块,j表示第i个的前两个是否为连续两块.那么F[ i ]的种类数分为: (1):前面是两个连续相同,那么F[ i

[CF1239A] Ivan the Fool and the Probability Theory - 组合数学

给定一个 \(n \times m\) 的方格图,每个格子可以被染成黑色或白色,且与其相邻的格子(上,下,左,右)中至多只有一个与其颜色相同.求方案数. Solution 依稀记得当年在热身赛上碰到这个题,大家都说是 CF 原题,然后我跪了-- 对于 \((i,j)\),如果它左.左上.上的颜色确定,那么这个格子的颜色就确定了 于是我们枚举 \((1,1)\) 的颜色,然后将第一行第一列的颜色确定下来,这时候行列显然相互独立 对于行,答案相当于一个 \(1/2\) 排列划分,对于列同理,于是答案

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除