链接:点击打开链接
题意:给出一个n,求斐波那契的前四位和后四位,并按照XXXX...XXXX的格式输出,如果不足八位直接全部输出
代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
#define Mod 10000
using namespace std;
long long f[100];
const int MAX=2;
typedef struct{
long long m[MAX][MAX];
}Matrix;
Matrix P={0,1,1,1};
Matrix I={1,0,0,1};
Matrix matrixmul(Matrix a,Matrix b){
int i,j,k;
Matrix c;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++){
c.m[i][j]=0;
for(k=0;k<MAX;k++)
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%Mod;
c.m[i][j]%=Mod;
}
return c;
} //矩阵乘法
Matrix quickpow(long long n){
Matrix m=P,b=I;
while(n>= 1){
if(n&1)
b=matrixmul(b,m);
n=n>>1;
m=matrixmul(m,m);
}
return b;
} //矩阵快速幂
int main(){
long long a[50],i,j,n,cur;
double tp=(sqrt(5)+1)/2,t;
Matrix temp;
a[0]=0;a[1]=1;
for(i=2;i<=39;i++){
a[i]=a[i-1]+a[i-2];
// cout<<a[i]<<endl;
}
while(scanf("%lld",&n)!=EOF){
if(n<=39){
cout<<a[n]<<endl;
continue;
}
temp=quickpow(n); //前四位数推导公式:
cur=temp.m[0][1]; //s=d.xxx*10^(len-4)
t=n*log10(tp)-0.5*log10(5.0); //log10(s)=log10(d.xxxxx)+log10(10^(len-4))=log10(d.xxxx)+len-4
t-=floor(t); //log10(s)+4-len=log10(d.xxxx)
t+=3; //d.xxxx=10^(log10(s)+4-len)
t=pow(10,t); //s=(1/sqrt(5))*[(1+sqrt(5))/2.0]^i
while(t<1000) //len=(int)log10(s)+1
t*=10; //d.xxxx=10^(log10(s)+4-((int)log10(s)+1))=10^(log10(s)-(int)log10(s)+3)
printf("%lld...",(long long)t);
printf("%04d\n",cur); //用%04d输出后四位
}
return 0;
}