POJ 2506 Tiling (递推+高精度)

题目链接】click here~~

题目大意

In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? 
Here is a sample tiling of a 2x17 rectangle. 

解题思路】:

(1)一个2*2的格子有三种填充方法:

两个横着放,

两个竖着放,

放一个2*2

(2)得出递推公式F[i]=F[i-1]+F[i-2]*2

然后就是套高精度模板了

代码;

/*
Author:HRW
递推+高精度!
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int Base=1e9;
const int Capacity=100;
typedef long long huge;
struct BigInt{
     int Len;
     int Data[Capacity];
     BigInt() : Len(0) {}
     BigInt (const BigInt &V) : Len(V.Len) { memcpy (Data, V.Data, Len*sizeof*Data);}
     BigInt(int V) : Len(0) {for(;V>0;V/=Base) Data[Len++]=V%Base;}
     BigInt &operator=(const BigInt &V) {Len=V.Len; memcpy(Data, V.Data, Len*sizeof*Data); return *this;}
     int &operator[] (int Index) {return Data[Index];}
     int operator[] (int Index) const {return Data[Index];}
};
int compare(const BigInt &A, const BigInt &B){
     if(A.Len!=B.Len) return A.Len>B.Len ? 1:-1;
     int i;
     for(i=A.Len-1;i>=0 && A[i]==B[i];i--);
     if(i<0)return 0;
     return A[i]>B[i] ? 1:-1;
}

BigInt operator+(const BigInt &A,const BigInt &B){
     int i,Carry(0);
     BigInt R;
     for(i=0;i<A.Len||i<B.Len||Carry>0;i++){
         if(i<A.Len) Carry+=A[i];
         if(i<B.Len) Carry+=B[i];
         R[i]=Carry%Base;
         Carry/=Base;
     }
     R.Len=i;
     return R;
}

BigInt operator-(const BigInt &A,const BigInt &B){
     int i,Carry(0);
     BigInt R;
     R.Len=A.Len;
     for(i=0;i<R.Len;i++){
         R[i]=A[i]-Carry;
         if(i<B.Len) R[i]-=B[i];
         if(R[i]<0) Carry=1,R[i]+=Base;
         else Carry=0;
     }
     while(R.Len>0&&R[R.Len-1]==0) R.Len--;
     return R;
}

BigInt operator*(const BigInt &A,const int &B){
     int i;
     huge Carry(0);
     BigInt R;
     for(i=0;i<A.Len||Carry>0;i++){
         if(i<A.Len) Carry+=huge(A[i])*B;
         R[i]=Carry%Base;
         Carry/=Base;
     }
     R.Len=i;
     return R;
}
istream &operator>>(istream &In,BigInt &V){
     char Ch;
     for(V=0;In>>Ch;){
         V=V*10+(Ch-'0');
         if(In.peek()<=' ') break;
     }
     return In;
}
ostream &operator<<(ostream &Out,const BigInt &V){
     int i;
     Out<<(V.Len==0 ? 0:V[V.Len-1]);
     for(i=V.Len-2;i>=0;i--) for(int j=Base/10;j>0;j/=10) Out<<V[i]/j%10;
     return Out;
}
BigInt fa[10000];
int main()
{
    fa[0]=fa[1]=1,fa[2]=3;
    for(int i=3;i<=250;i++)
    {
        fa[i]=fa[i-1]+fa[i-2]+fa[i-2];
    }
    unsigned long long  n;
    while(cin>>n)
    {
       cout<<fa[n]<<endl;
    }
    return 0;
}



你可能感兴趣的:(ACM,高精度,递推)