斐波那契递推式:F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}
HDU 3117 求斐波那契的前四位和后四位
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=10000;
int f[41]={0,1};
struct Matrix
{
int mat[2][2];
Matrix operator * (const Matrix &m) const
{
Matrix t;
memset(t.mat,0,sizeof(t.mat));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
t.mat[i][j]=(t.mat[i][j]+mat[i][k]*m.mat[k][j]%MOD)%MOD;
return t;
}
};
Matrix Pow(Matrix a,int n)
{
Matrix b;
memset(b.mat,0,sizeof(b.mat));
for(int i=0;i<2;i++)
b.mat[i][i]=1;
while(n)
{
if(n&1)
b=b*a;
a=a*a;
n/=2;
}
return b;
}
int main()
{
for(int i=2;i<41;i++)
f[i]=f[i-1]+f[i-2];
// printf("%d",f[39]);
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<40)
{
printf("%d\n",f[n]);
continue;
}
Matrix a;
a.mat[0][0]=a.mat[0][1]=a.mat[1][0]=1;
a.mat[1][1]=0;
a=Pow(a,n);
double t=-0.5*log(5.0)/log(10.0)+((double)n)*log((sqrt(5.0)+1.0)/2.0)/log(10.0);
t-=floor(t);
t=pow(10.0,t);
while(t<1000)
t*=10;
printf("%d...%04d\n",(int)t,a.mat[1][0]);
}
return 0;
}