P1990 覆盖墙壁
题目描述
你有一个长为 N N N 宽为 2 2 2 的墙壁,给你两种砖头:一个长 2 2 2 宽 1 1 1,另一个是 L 型覆盖 3 3 3 个单元的砖头。如下图:
0 0
0 00
砖头可以旋转,两种砖头可以无限制提供。你的任务是计算用这两种来覆盖 N × 2 N\times 2 N×2 的墙壁的覆盖方法。例如一个 2 × 3 2\times3 2×3 的墙可以有 5 5 5 种覆盖方法,如下:
012 002 011 001 011
012 112 022 011 001
注意可以使用两种砖头混合起来覆盖,如 2 × 4 2\times4 2×4 的墙可以这样覆盖:
0112
0012
给定 N N N,要求计算 2 × N 2\times N 2×N 的墙壁的覆盖方法。由于结果很大,所以只要求输出最后 4 4 4 位。例如 2 × 13 2\times 13 2×13 的覆盖方法为 13465 13465 13465,只需输出 3465 3465 3465 即可。如果答案少于 4 4 4 位,就直接输出就可以,不用加前导 0 0 0,如 N = 3 N=3 N=3 时输出 5 5 5。
输入格式
一个整数 N N N,表示墙壁的长。
输出格式
输出覆盖方法的最后 4 4 4 位,如果不足 4 4 4 位就输出整个答案。
输入输出样例 #1
输入 #1
13
输出 #1
3465
说明/提示
数据保证, 1 ≤ N ≤ 1000000 1\leq N\leq 1000000 1≤N≤1000000。
C++实现
#include<iostream>
using namespace std;
const int maxn=1000002;
const int mod=10000;
int f[maxn],g[maxn];
int main()
{
int n;
cin>>n;
f[0]=1; //g[0]=0
f[1]=g[1]=1;
for(int i=2;i<=n;i++)
{
f[i]=((f[i-1]+f[i-2])%mod+2*g[i-2]%mod)%mod;
g[i]=(g[i-1]+f[i-1])%mod;
}
cout<<f[n];
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容