CF1239A Ivan the Fool and the Probability Theory 题解

CF1239A Ivan the Fool and the Probability Theory

洛谷链接

首先考虑 $n=1$ 时的情况,设 $ans_i$ 为有 $i$ 列时的答案,分情况讨论。

当 $col_i=col_{i-1}$ 时,当前的方案数就等同于前 $i-1$ 列的合法方案数量,即 $ans_i=ans_{i-1}$。

当 $col_i=col_{i-2}$ 时,$col_{i-1}$ 就可以被确定下来,故 $ans_i=ans_{i-2}$。 

综上可得答案为 $ans_m=f_m\times2$ ,其中 $f_i$ 表示 Fibonacci 数列的第 $i$ 项,乘 2 是因为有白黑两种颜色。

当 $n \gt 1$ 时,考虑在原先结论上拓展。

不难发现,当第一行和第一列都已经确定下来的时候,剩下的格子可以从上往下递推出来。

具体证明很简单,只有 8 种情况,手推一下即可。

那么问题就转化为了求第一行第一列合法的所有方案,不难发现为 $(f_n+f_m-1)\times2$。

其中减去 1 是因为有一种不合法的方案:即 (1,1),(1,2),(2,1) 颜色相同,故应减去。

代码:

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn = 100005;
 6 int f[maxn],n,m;
 7 const int mod = 1e9 + 7;
 8 int main() {
 9     scanf("%d%d",&n,&m);
10     f[0] = 1;
11     f[1] = 1;
12     for(int i = 2;i <= max(n , m);++ i) {
13         f[i] = (f[i - 1] + f[i - 2]) % mod;
14     }
15     printf("%d",((f[n] + f[m] - 1) % mod) * 2 % mod);
16     return 0;
17 }
View Code

 

posted @ 2022-01-08 18:18  ImALAS  阅读(40)  评论(0编辑  收藏  举报