让我这种高数挂科的人写一天的斐波那契你这是要我死啊
这道题八位数之前的都打表了
听说后四位的循环周期是15000 不知道怎么证明所以没用 - -
前四位 推倒 :
封闭形式的通项公式 s=1/sqrt(5)*[(1+sqrt(5))/2]
s=d.xx*10^(len-4)
举例 123456的d.xx就是1234.56 len是整数长度 这里有个实用小公式 len = (int) lg(s) - 1 自己想想也能推出来的
4就是前四位
两边取对数 lg(d.xx) = lg(s)-len+4
d.xx = 10^(lg(s)-len+4);
d = (int) 10^(lg(s)-len+4);
然后带入len
后四位 推倒:
矩阵快速幂
什么时候用快速幂什么时候用公式要弄清啊。。
#include <stdio.h>
#include <string.h>
#include <math.h>
const int mod = 10000;
int save[]={0 ,1 ,1 ,2 ,3 ,5 ,8 ,13 ,21 ,34 ,
55 ,89 ,144 ,233 ,377 ,610 ,987 ,1597 ,2584 ,4181 ,
6765 ,10946 ,17711 ,28657 ,46368 ,75025 ,121393 ,196418 ,317811 ,514229 ,
832040 ,1346269 ,2178309 ,3524578 ,5702887 ,9227465 ,14930352 ,24157817 ,39088169 ,63245986};
struct mat
{
int f[2][2];
friend mat operator*(mat a,mat b)
{
mat c;
memset(c.f,0,sizeof(c.f));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.f[i][j]+=(a.f[i][k]%mod*b.f[k][j]%mod)%mod;
return c;
}
};
void bix(int n)
{
mat a,b;
a.f[0][0]=b.f[0][1]=b.f[1][0]=0;
a.f[0][1]=a.f[1][1]=a.f[1][0]=b.f[0][0]=b.f[1][1]=1;
for(;n;n>>=1)
{
if(n&1)
b=b*a;
a=a*a;
}
int tmp = b.f[1][1]%mod;
int cnt=1000;
for(;cnt!=1;cnt/=10)
if(tmp<cnt)
printf("0");
printf("%d\n",b.f[1][1]%mod);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<40)
{
printf("%d\n",save[n]);
continue;
}
double a=log10(1/sqrt(5));
double b=n*log10(0.5+sqrt(5)*0.5);
a=a+b-(int)(a+b)+3;
int c=(int)pow(10,a);
printf("%d...",c);
bix(n-1);
}
}