斐波那契数生成麻烦

时间:2015-07-17 13:26:01

标签: c++ matrix-multiplication fibonacci

我必须从第一个(第零个)数字a生成第n个斐波纳契数,第二个是b。下面是我计算这个的代码。我一直在使用矩阵取幂方法:

但解决方案是错误的。

costum input:509618737 460201239 229176339(in order a,b,n)a=zeroth value,b=first value,n=Nth value to be found.
output:995159166
correct output:945141656

我的代码有什么问题?

#include<iostream>

using namespace std;

void multiply(long long F[2][2], long long M[2][2]);//prototype of function multiplying 2 matrices.
void power(long long F[2][2],long long n);//prototype for incresing power

long long fib(long long n,long long a,long long b)//function that returns result as answer modulo 10^9+7(since answer is too long).
{
    long long F[2][2] = {{1,1},{1,0}};
    if (n == 0)
        return a;
    else if(n==1)
        return b;
    else if(n>1)
        power(F, n-1);
    return (F[0][0]*a+F[0][1]*b)%1000000007;//here's where i am confused ,whether i should multyply  a first or b first i.e.f[0][0]*a+f[0][1]*b or f[0][0]*b+f[0][1]*a.plz explain this point too.
}

void power(long long F[2][2], long long n) 
{
    if( n == 0 || n == 1)
        return;
    long long M[2][2] = {{1,1},{1,0}};

    power(F, n/2);
    multiply(F, F);

    if (n%2 != 0)
        multiply(F, M);
}

void multiply(long long F[2][2], long long M[2][2])//matrices multiplied.
{
    long long x =  F[0][0]*M[0][0] + F[0][1]*M[1][0];
    long long y =  F[0][0]*M[0][1] + F[0][1]*M[1][1];
    long long z =  F[1][0]*M[0][0] + F[1][1]*M[1][0];
    long long w =  F[1][0]*M[0][1] + F[1][1]*M[1][1];

    F[0][0] = x;
    F[0][1] = y;
    F[1][0] = z;
    F[1][1] = w;
}

int main()
{
    long long t, a, b, n, ans;

    cin>>t;//# of test cases

    while(t--)
    {  
        cin>>a;//zeroth value
        cin>>b;//first value
        cin>>n;//Nth fibonaaci no. to be generated 
        ans=fib(n,a,b);//value of Nth no.
        cout<<ans<<"\n";
    }

    return 0;
}

0 个答案:

没有答案
相关问题