在2*N的一个长方形方格中,用一个1*2的骨牌排满方格。
问有多少种不同的排列方法。
例如:2 * 3的方格,共有3种不同的排法。(由于方案的数量巨大,只输出 Mod 10^9 + 7 的结果)
输入格式
输入N(N <= 1000)
输出格式
输出数量 Mod 10^9 + 7
输入样例
3
输出样例
3
本题的难点在于推导方法:
2×n2×n 的方案可以从 2×(n−1)2×(n−1) 以及 2×(n−2)2×(n−2) 的方案构造而来,在 2×(n−2)2×(n−2) 的方案上增加两个 2×12×1 的骨牌,以及在 2×(n−1)2×(n−1) 的方案上加一个 1×21×2 的骨牌。这两种构造得到的最终方案不会出现重复,因此最终的方案数就是斐波那契数列。
在代码实现方面,可以尝试只利用循环,不使用数组来计算斐波那契数列的值。
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int MAXN = 1e5 + 5;
int f[1005] = { 0,1,2 };
int main() {
int n;
scanf("%d", &n);
for (int i = 3; i <= n; i++) {
f[i] = (1LL * f[i - 1] + f[i - 2]) % MOD;
}
printf("%d\n", f[n]);
return 0;
}