9273:PKU2506Tiling

时间:2023-03-10 03:10:07
9273:PKU2506Tiling

9273:PKU2506Tiling

来源:http://noi.openjudge.cn/ch0202/9273/

总时间限制:2000ms  单个测试点时间限制:1000ms
内存限制:131072kB
描述
    对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。
    下图是一个2行17列的走道的某种铺法。

9273:PKU2506Tiling

输入
    整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250
输出
    如题
样例输入
    2
    8
    12
    100
    200
样例输出
    3
    171
    2731
    845100400152152934331135470251
    1071292029505993517027974728227441735014801995855195223534251

分析:
f[n] = f[n-1] + f[n-2]*2 ;

使用这个递推公式,再加上高精度计算即可。

综合了高精度、递推,而且高精度的运用比较熟悉、巧妙。

代码来源:http://blog.csdn.net/c20180630/article/details/52329721

     #include<iostream>
#include<cstdio>
using namespace std;
int a[][]; //a[i]用来存储一个大整数,其中a[i][0]存储长度,真实数据倒序存储。
int max(int x,int y){return x>y?x:y;}
int main()
{
a[][]=;
a[][]=;
a[][]=;
a[][]=;
for(int i=;i<=;i++){
for(int j=;j<=max(a[i-][],a[i-][]);j++)
a[i][j]=a[i-][j]+a[i-][j]*; //高精度加法(按位加的操作)
a[i][]=max(a[i-][],a[i-][]);
for(int j=;j<=a[i][];j++){ //高精度加法的进位
a[i][j+]+=a[i][j]/;
a[i][j]%=;
}
while(a[i][a[i][]+]){ //更新高精度加法结果的位数
a[i][]++;
a[i][a[i][]+]+=a[i][a[i][]]/;
}
}
int n;
while(cin>>n){
if(n==)
cout<<<<endl;
else{
for(int i=a[n][];i>=;i--)
cout<<a[n][i];
cout<<endl;
}
}
}