9273:PKU2506Tiling

9273:PKU2506Tiling

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

总时间限制: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

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

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

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

 

#include<cstdio> using namespace std; int a[301][501]; //a[i]用来存储一个大整数,其中a[i][0]存储长度,真实数据倒序存储。 int max(int x,int y){return x>y?x:y;} int main() { 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<=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]=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; } } 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; } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值