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时每一行只有两种状态,此时可以把两种状态看成0和1,即和n=1时的算法是一样的,答案就是F[n]-2+F[m]。

代码如下:

#include<bits/stdc++.h>
#include<vector>
#include<map>
#include<queue>
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
LL Fib[200005];
int main()
{
    LL n, m, q, ans;
    scanf("%lld%lld", &n, &m);
    Fib[1] = 2;
    Fib[2] = 4;
    LL t = max(m,n);
    for(int i = 3;i <= t;i++)
        Fib[i] = (Fib[i-1]%MOD + Fib[i-2]%MOD)%MOD;
    ans = (Fib[n]%MOD + Fib[m]%MOD - 2)%MOD;
    printf("%lld\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Mamba0Z/p/11715786.html

时间: 2024-11-07 15:16:59

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

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 个格子里放白色的放法有多少,d

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 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倍关系或者消除