2013金山西山居创意游戏程序挑战赛——初赛(2)M斐波那契数列

这题很容易就可以推出f(n)的公式。

这个用到了矩阵和整数的快速2分幂,还需注意一点就是pow(n,m)=pow(n,m mod 1000000006);

千万注意别写成mod 1000000007 ,否者会一直WA的。

#include<iostream>
#include<stdio.h>
using namespace std;
typedef
__int64 in;
struct
aa
{

    in a[2][2];
    void
init()
    {

        a[0][0]=a[0][1]=a[1][0]=1;
        a[1][1]=0;
    }
};

aa mul(aa m,aa n)
{

    aa ans;
    for
(int i=0;i<2;i++)
        for
(int j=0;j<2;j++)
        {

            ans.a[i][j]=0;
            for
(int k=0;k<2;k++)
                ans.a[i][j]+=m.a[i][k]*n.a[k][j];
            ans.a[i][j]%=1000000006;
        }

    return
ans;
}

aa fun(aa m,long n)
{

    aa ans;
    ans.init();
    while
(n)
    {

        if
(n&1)
            ans=mul(m,ans);
        n>>=1;
        m=mul(m,m);
    }

    return
ans;
}

in fun2(in a,long n)
{

    in ans=1;
    while
(n)
    {

        if
(n&1)
            ans=(ans*a)%1000000007;
        n>>=1;
        a=(a*a)%1000000007;
    }

    return
ans%1000000007;
}

int
main()
{

    long
a,b,n;
    in i,j,sum;
    while
(cin>>a>>b>>n)
    {

        sum=0;
        aa ans,p;
        ans.init();
        if
(n==0)
            sum=a;
        else if
(n==1)
            sum=b;
        else

        {

            p=fun(ans,n-1);
            i=fun2(a,p.a[1][1]%1000000006);
            j=fun2(b,p.a[1][0]%1000000006);
            sum=i*j;
        }

        printf("%I64d\n",sum%1000000007);
    }

    return
0;
}

你可能感兴趣的:(游戏)