Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7264 | Accepted: 3528 |
Description
Input
Output
Sample Input
2 8 12 100 200
Sample Output
3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251
【题目来源】
The UofA Local 2000.10.14
http://poj.org/problem?id=2506
【题目大意】
意思很简单,给你一块2*n的地板,问你使用1*2、2*2的瓷砖来铺有几种方法。
【题目分析】
看到样例就可以发现是高精度。
首先,我们假设前2*(n-1)块地板已经铺好了,那么我们要铺到2*n就只有一种方法,就是使用1*2这一种瓷砖。
假设前2*(n-2)块地板已经铺好了,那么我们要铺到2*n则有三种方法,也就是使用两块1*2,或者使用两块2*1,或者使用一块2*2,但是这其中有一种是包含在上面的
方法中的,所以在递推的时候只能算2种。
因此我们得到了我们的递推公式:
f(1)=1;
f(2)=1;
f(3)=3;
f(n)=f(n-1)+f(n-2)*2;
剩下的就是实现的问题,高精度简单加法。
ac代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<bitset> #include<vector> #include<cmath> #include<stack> #include<queue> using namespace std; int ans[260][300]; int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { memset(ans,0,sizeof(ans)); ans[0][0]=1; ans[1][0]=1; ans[2][0]=3; if(n<=2) { printf("%d\n",ans[n][0]); } else { int temp=0; int s=0; for(i=3;i<=n;i++) { for(j=0;j<300;j++) { s=ans[i-1][j]+ans[i-2][j]*2+temp; ans[i][j]=s%10; temp=s/10; } } int flag=0; for(i=300;i>=0;i--) { if(flag||ans[n][i]) { flag=1; printf("%d",ans[n][i]); } } puts(""); } } return 0; }