D e s c r i p t i o n Description Description
您可以通过几种方式用 2 ∗ 1 2*1 2∗1或 2 ∗ 2 2*2 2∗2瓦片平铺 2 ∗ n 2*n 2∗n矩形?
这是一个 2 ∗ 17 2*17 2∗17矩形的样本拼贴:
I n p u t Input Input
每行一个整数 n n n。
O u t p u t Output Output
每行一个整数,表示方案数。
S a m p l e Sample Sample I n p u t Input Input
2
8
12
100
200
S a m p l e Sample Sample O u t p u t Output Output
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251
H i n t Hint Hint
对于 100 % 100\% 100%的数据, 0 ≤ n ≤ 250 0 \leq n \leq 250 0≤n≤250。
T r a i n Train Train o f of of T h o u g h t Thought Thought
F k F_k Fk表示有k列的方案数
那么可以考虑
1. F k − 1 1.F_{k-1} 1.Fk−1中最后加一个 2 ∗ 1 2*1 2∗1的方块
2. F k − 2 2.F_{k-2} 2.Fk−2中最后加两个 1 ∗ 2 1*2 1∗2的方块,或者一个 2 ∗ 2 2*2 2∗2的方块
那么 F k = F k − 1 + F k − 2 ∗ 2 F_k=F_{k-1}+F_{k-2}*2 Fk=Fk−1+Fk−2∗2
ps
高精压位
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define Mod 10000
#define ll long long
using namespace std;
const int N = 500;
ll A[300][N + 5];
ll n;
void Add(int k)
{
int g = 0;
for(int i = 1; i <= N; ++i)
{
A[k][i] = 2 * A[k - 2][i] + A[k - 1][i] + g;
g = A[k][i] / Mod;
A[k][i] %= Mod;
}
}
int main()
{
A[1][1] = 1, A[2][1] = 3;
for(int i = 3; i <= 250; ++i)
Add(i);
scanf("%lld", &n);
while(n)
{
int l = N + 1;
while(--l && !A[n][l]);
printf("%lld", A[n][l]);
while(--l > 0)
{
if(A[n][l] < 1000)printf("0");
else if(A[n][l] < 100)printf("00");
else if(A[n][l] < 10)printf("000");
printf("%lld", A[n][l]);
}
printf("\n");
n = 0;
scanf("%lld", &n);
}
}