【题目链接】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; }
时间: 2024-10-21 01:13:01