Tiling
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7481 | Accepted: 3658 |
Description
In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles?
Here is a sample tiling of a 2x17 rectangle.
Here is a sample tiling of a 2x17 rectangle.
![](https://i-blog.csdnimg.cn/blog_migrate/09098a4c7bc0e6dc5cb68974dc819f84.jpeg)
Input
Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.
Output
For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle.
Sample Input
2 8 12 100 200
Sample Output
3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251
解题思路:打表+递推+大数;
#include<stdio.h> #include<stdlib.h> #include<string.h> #define mx 2010 int ls[mx]; int s[260][mx]; int main() { int n,i,j; memset(ls,0,sizeof(ls));//清空数组为下一次做准备 memset(s,0,sizeof(s)); s[0][0]=1; s[1][0]=1; for(i=2;i<=250;i++) { for(j=0;j<=mx;j++)//s[i]表示第i个数;s[i][j]表示第i个数的第j位数 ls[j]=s[i-1][j]+s[i-2][j]*2;//将第i个数的每一位上的数用ls[]存起来 for(j=0;j<mx;j++)//对ls[]做大数相加处理 { ls[j+1]+=(ls[j]/10); ls[j]%=10; } for(j=0;j<=mx;j++)//处理后再赋值回s[i][] s[i][j]=ls[j]; memset(ls,0,sizeof(ls));//再次清空数组ls[]; } while(~scanf("%d",&n)) { j=mx-1; while(s[n][j]==0) j--; for(;j>=0;j--) printf("%d",s[n][j]); printf("\n"); } return 0; }