骨牌覆盖问题·二
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题?
所以我们的题目是:对于3xN的棋盘,使用1x2的骨牌去覆盖一共有多少种不同的覆盖方法呢?
首先我们可以肯定,奇数长度一定是没有办法覆盖的;对于偶数长度,比如2,4,我们有下面几种覆盖方式:

输入
第1行:1个整数N。表示棋盘长度。1≤N≤100,000,000
输出
第1行:1个整数,表示覆盖方案数 MOD 12357
62247088样例输出
4037
提示:
首先当n为奇数时显然无解的,输出0;
当n为偶数时,从小看:
n=2时有3种。每增加两列,可以看成一下情况:
1.这两列与之前不相连,单独摆放,有3种,即3*f(n-2);
2.这两列与之前两列中间相连,也就是说中线有横着摆放的(n-2和n-1列),有这种,还可以把底下两个横着的放到顶上,所以有两种情况,把后4列看作整体,即2*f(n-4);
而还有可能n-3与n-4列之间相连,即把后6列看作整体,也有两种,即2*f(n-6),递推之。
递推的终点是f(0)=1;f(2)=3;
#include <iostream>
using namespace std;
typedef unsigned long long ll;
const ll MOD = 12357;
ll N;
ll a[5];
void solve() {
a[0] = 0;
a[1] = 2;
a[2] = 3;
for (int i = 3; i <= N; ++i) {
cout<<(i&1)<<endl;
if (i&1) { //i为奇数
a[i%5] = (2*a[(i-1+5)%5] + a[(i-2+5)%5]) % MOD;
} else { //i为偶数
a[i%5] = (3*a[(i-2+5)%5] + a[(i-3+5)%5]) % MOD;
}
}
cout << a[N%5] << endl;
}
int main() {
while (cin >> N) {
if (N & 1) {
cout << "0" << endl;
} else {
solve();
}
}
return 0;
}
注:代码转
态度决定高度,细节决定成败,

浙公网安备 33010602011771号