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) 颜色相同,故应减去。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }