链接
题目描述
您可以通过几种方式用 2 ∗ 1 2*1 2∗1 或 2 ∗ 2 2*2 2∗2 瓦片平铺 2 ∗ n 2*n 2∗n 矩形?
样例输入
2
8
12
100
200
样例输出
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251
思路
设
f
i
f_i
fi表示放
i
i
i块矩阵的方案
那么我们考虑当前位置放什么矩阵
1.横着放两块21的矩阵,那么就是
f
i
−
2
f_{i-2}
fi−2
2.竖着放两块21的矩阵,那么就是
f
i
−
2
f_{i-2}
fi−2
3.放一块2*2的矩阵。那么就是
f
i
−
1
f_{i-1}
fi−1
所以可得
f
i
=
2
∗
f
i
−
2
+
f
i
−
1
f_i = 2 * f_{i-2} + f_{i-1}
fi=2∗fi−2+fi−1
高精一下就可了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n, f[500][500], g;
int main()
{
f[0][1] = 1;
f[1][1] = 1;
for(int i = 2; i <= 250; ++i)
{
for(int j = 1; j <= 200; ++j)
{
f[i][j] += f[i - 1][j] + f[i - 2][j] * 2;
f[i][j + 1] = f[i][j] / 10;
f[i][j] %= 10;
}
}
while(~scanf("%d", &n))
{
g = 100;
while(!f[n][g]) g--;
for(int i = g; i >= 1; --i)
printf("%d", f[n][i]);
printf("\n");
}
return 0;
}