Tiling
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9536 | Accepted: 4539 |
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.
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 <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int s[1010][110];
void reset()
{
s[0][0]=1; ///s[X][0] 表示这个数一共多少位 注意逆序打印
s[0][1]=1;
s[1][0]=1;
s[1][1]=1;
int j,k,i,n,sum,num;
for(i=2; i<=255; i++)
{
num=0; ///用来记录进位
for (k=1; k<=s[i-2][0]; k++)
{
if (num==1)
{
sum=1; ///计算加和值以及处理循环内进位
num=0;
}
else
{
sum=0;
}
sum+=s[i-2][k]*2; ///处理两个数相加 s[i-2]*2
if (sum>=10)
{
num=1;
}
sum%=10;
s[i][0]+=1;
s[i][k]+=sum;
}
if (num==1)
{
s[i][k]+=1; ///进位
s[i][0]+=1; ///多出一位数 计数
}
num=0;
for (k=1; k<=s[i-1][0]; k++)
{
if (num==1)
{
sum=1;
num=0;
}
else
{
sum=0;
}
sum+=s[i-1][k]+s[i][k]; ///在处理 s[i-1]+s[i]
if (sum>=10)
{
num=1;
}
sum%=10;
s[i][k]=sum; ///与上面不同 本身就加出来结果sum
}
if (num==1)
{
if (s[i][k]==0) ///如果本来最高位为0 则计数加一位
{
s[i][0]+=1;
}
s[i][k]+=1; ///进位
}
}
}
int main()
{
memset(s,0,sizeof(s));
reset();
int i,k;
while (cin>>i)
{
for(k=s[i][0]; k>=1; k--)
{
cout<<s[i][k];
}
cout<<endl;
}
return 0;
}