hihocoder1143 斐波拉契数列

来源:互联网 发布:sql注入绕过空格 编辑:程序博客网 时间:2024/05/22 15:47

题目地址:http://hihocoder.com/problemset/problem/1143

题目比较简单,我用了两种方法做,一种是用矩阵的幂,一种是较实用的循环解法(把中间结果保存)。可是不明白为什么第二种方法时间需要那么多。好吧,直接上代码:

1. 快速矩阵幂

#include<iostream>using namespace std;const int MOD=19999997;struct matrix{    long long int mat[2][2];};matrix ans,base;void init(){    base.mat[0][0]=0;    base.mat[0][1]=1;    base.mat[1][0]=1;    base.mat[1][1]=1;        ans.mat[0][0]=1;    ans.mat[0][1]=0;    ans.mat[1][0]=0;    ans.mat[1][1]=1;}matrix multi(matrix a,matrix b){    matrix c;    for (int i=0;i<2;++i)        for (int j=0;j<2;++j)        {            c.mat[i][j]=0;            for (int k=0;k<2;++k)            {                c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%MOD;                c.mat[i][j]%=MOD;            }        }    return c;}void fabonaci(int n){    while (n)    {        if (n&1)            ans=multi(ans,base);        n=(n>>1);        base=multi(base,base);    }    }int main(){    init();        int N;    cin>>N;        fabonaci(N);        cout<<ans.mat[1][1]<<endl;        return 0;}

2. 循环,保存中间结果

#include<iostream>using namespace std;const int MOD=19999997;int fabonaci(int n){    int result[2]={0,1};    if (n<=1)        return result[n];        int addone=result[0];    int addtwo=result[1];    int ans;    for (int i=2;i<=n;++i)    {        ans=(addone+addtwo)%MOD;        addone=addtwo%MOD;        addtwo=ans%MOD;    }    return ans;}int main(){    int N;    cin>>N;        cout<<fabonaci(N+1)<<endl;        return 0;}


0 0
原创粉丝点击