hdu 3306 Another kind of Fibonacci

这题属于矩阵构造,有

a(n)=x*a(n-1)+y*a(n-2);

s(n)=s(n-1)+a(n)^2;

联立可得到相关矩阵,再用矩阵2分快速幂就可得到结果了……

#include<iostream>
#include<stdio.h>
using namespace std;
typedef
__int64 int64;
long
x,y,n;
const
int mod=10007;
struct
matrix
{

    int64 a[4][4];
};

matrix e;
matrix mul(matrix m,matrix n)
{

    matrix ans;
    for
(int i=0;i<4;i++)
        for
(int j=0;j<4;j++)
        {

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

    return
ans;
}

matrix fun1(matrix m,long n)
{

    matrix ans;
    ans=e;
    while
(n)
    {

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

    return
ans;
}

int
main()
{

    int
i,j;
    for
(i=0;i<4;i++)
        for
(j=0;j<4;j++)
            e.a[i][j]=(i==j);
    while
(scanf("%d%d%d",&n,&x,&y)!=EOF)
    {

        matrix p,ans;
        int64 sum=0;
        for
(i=0;i<4;i++)
            for
(j=0;j<4;j++)
                p.a[i][j]=0;
        p.a[0][0]=p.a[0][1]=1;p.a[1][1]=((x%mod)*(x%mod))%mod;p.a[1][2]=((y%mod)*(y%mod))%mod;p.a[1][3]=2*(x%mod)*(y%mod);
        p.a[2][1]=1;p.a[3][1]=x%mod;p.a[3][3]=y%mod;
        ans=fun1(p,n);
        sum=ans.a[0][0]+ans.a[0][1]+ans.a[0][2]+ans.a[0][3];
        printf("%I64d\n",sum%mod);
    }

    return
0;
}

你可能感兴趣的:(fibonacci)