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
首先找到递推公式f(i)=f(i-1)+2*f(i-2),其次套上大整数类。
#include <iostream>
#include<iomanip>
#include<vector>
using namespace std;
struct BigInteger{
static const int BASE=1000000;
static const int WIDTH=6;
vector<int> s;
BigInteger(long long num=0){*this=num;}
BigInteger operator =(long long num){
s.clear();
do{
s.push_back(num%BASE);
num/=BASE;
}while(num>0);
return *this;
}
BigInteger operator +(const BigInteger& b) const{
BigInteger c;
c.s.clear();
for(int i=0,g=0;;i++){
if(g==0&&i>=s.size()&&i>=b.s.size()) break;
long x=g;
if(i<s.size()) x+=s[i];
if(i<b.s.size()) x+=b.s[i];
c.s.push_back(x%BASE);
g=x/BASE;
}
return c;
}
};
ostream& operator <<(ostream &out,const BigInteger& x){
out<<x.s.back();
for(int i=x.s.size()-2;i>=0;i--){
out<<setw(6)<<setfill('0') <<x.s[i];
}
return out;
}
int main()
{
BigInteger dp[255];
int n,i;
dp[0]=dp[1]=1;
for(i=2;i<=250;i++){
dp[i]=dp[i-1]+dp[i-2]+dp[i-2];
}
// for(int i = 0; i<= 200; i++){cout << dp[i] << endl;}
while(cin>>n){
cout<<dp[n]<<endl;
}
return 0;
}