骨牌覆盖
tale.pascal/c/cpp
【题目描述】
给定一个2行n列的棋盘,用1*2的骨牌去完整覆盖,求方案数。
【输入】
输入仅包含一个数n。
【输出】
输出合法方案数模上1000000007。
【输入样例】
3
【输出样例】
3
【样例解释】
000
000 表示一个长度为3,宽度为2的棋盘,有如下三种覆盖方式
112
332
123
123
122
133
1~3的数字分别表示三块不同骨牌的摆放
注意:骨牌是不加以区分的,也就是说
112
332
和
113
223 被认为是同一种情况。
【数据规模】
对于20%的数据,n<5
对于所有数据,n<=100000
完成情况:
这一题题目上说了有N<=5的数据,那么本着骗分的原则我们也应该把这20%的数据算出来
只要我们去动手算了后,就会很容易的发现这是一个斐波那契数列!
答案要求取余,但要注意,一定要每步取余,因为斐波那契数列到后来是一个很大的数(我自己写高精度算过,那一个数就足以在记事本中占十几行了~~)
C++ AC Code
/*
C++ Code
http://blog.youkuaiyun.com/jiangzh7
By Jiangzh
*/
#include<cstdio>
#include<iostream>
using namespace std;
const int N=100010;
const int MOD=1000000007;
int n;
long long f[N];
int main()
{
freopen("tale.in","r",stdin);
freopen("tale.out","w",stdout);
scanf("%d",&n);
f[1]=1;f[2]=2;
for(int i=3;i<=n;i++)
f[i]=(f[i-1]+f[i-2])%MOD;
cout<<f[n]<<endl;
return 0;
}