hdu3117

非常好的一道题目,包括了f[n]=f[n-1]+f[n-2]的递推计算、前4位、后四位值的计算。

前39位利用递推即可。

39位之后,求前四位利用公式,s=(1/sqrt(5))*(1+sqrt(5))^i,d.xxx=10^log10(s)-(int)log10(s)+3; d即为前4位的值

后四位的值利用矩阵连乘求得。

但值得注意的是求后四位的时候可能出现123,三位的情况,因为倒数第四位可能为0,所以在输出的时候应该小心!

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAX 2
#define Mod 10000
int f[40];
typedef struct
{
    int 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()
{
    int i,n,ans1,ans2;
    double s,t,tmp;
    f[0]=0;f[1]=1;f[2]=1;
    for(i=3;i<=39;i++)
        f[i]=f[i-1]+f[i-2];
    while(scanf("%d",&n)!=EOF)
    {
        if(n<=39)
        cout<<f[n]<<endl;
        else
        {
            s=(1+sqrt(5.0))/2;
            tmp=log10(1/sqrt(5.0))+n*log10(s);
            t=tmp-(int)tmp+3;
            ans1=pow(10,t);
            while(ans1<1000)
                ans1*=10;
            Matrix d;
            d=quickpow(n);
            ans2=d.m[0][1];
            printf("%d...%04d\n",ans1,ans2);
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值