hdu3117Fibonacci Numbers

让我这种高数挂科的人写一天的斐波那契你这是要我死啊

这道题八位数之前的都打表了

听说后四位的循环周期是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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值