9273:PKU2506Tiling
- 总时间限制:
- 2000ms
- 单个测试点时间限制:
- 1000ms
- 内存限制:
- 131072kB
- 描述
-
对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。
下图是一个2行17列的走道的某种铺法。 - 输入
-
整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250
- 输出
-
如题
- 样例输入
-
2 8 12 100 200
- 样例输出
-
3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251
#include<iostream> #include<iomanip> #include<cstring> #include<cmath> #include<cstdio> using namespace std; int a[301][501]; int my_max(int x,int y) { return x>y?x:y; } int main() { memset(a,0,sizeof(a)); a[1][0]=1; a[1][1]=1; a[2][0]=1; a[2][1]=3; for(int i=3;i<=300;i++) { for(int j=1;j<=my_max(a[i-2][0],a[i-1][0]);j++) { a[i][j]=a[i-1][j]+a[i-2][j]*2; } a[i][0]=my_max(a[i-2][0],a[i-1][0]); for(int j=1;j<=a[i][0];j++) { a[i][j+1]+=a[i][j]/10; a[i][j]%=10; } while(a[i][a[i][0]+1]) { a[i][0]++; a[i][a[i][0]+1]+=a[i][a[i][0]]/10; a[i][a[i][0]]%10; } } int n; while(cin>>n) { if(n==0)cout<<1<<endl; else { for(int i=a[n][0];i>=1;i--) cout<<a[n][i]; cout<<endl; } } return 0; }