题目链接: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 ", ans); return 0; }