hdu3306Another kind of Fibonacci(矩阵连乘&矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3306

分析:

hdu3306Another kind of Fibonacci(矩阵连乘&矩阵快速幂)_第1张图片

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int mod = 10007;
struct matrix
{
    ll m[4][4];
};
matrix A;
matrix I={
   1,0,0,0,
   0,1,0,0,
   0,0,1,0,
   0,0,0,1
};
matrix multi(matrix a,matrix b)
{
    matrix c;
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++){
                c.m[i][j]=0;
            for(int k=0;k<4;k++){
                c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod;
            }
            c.m[i][j]%=mod;
        }
    return c;
}
matrix power(matrix A,ll k)
{
    matrix ans=I,p=A;
    while(k){
        if(k&1){
            ans=multi(ans,p);
            k--;
        }
        k>>=1;
        p=multi(p,p);
    }
    return ans;
}
int main()
{
    ll n,x,y;
    while(cin>>n>>x>>y){
        A.m[0][0]=1;A.m[0][1]=x%mod*x%mod;A.m[0][2]=y%mod*y%mod;A.m[0][3]=2*x%mod*y%mod;
        A.m[1][0]=0;A.m[1][1]=x%mod*x%mod;A.m[1][2]=y%mod*y%mod;A.m[1][3]=2*x%mod*y%mod;
        A.m[2][0]=0;A.m[2][1]=1;A.m[2][2]=0;A.m[2][3]=0;
        A.m[3][0]=0;A.m[3][1]=x%mod;A.m[3][2]=0;A.m[3][3]=y%mod;
            matrix ans=power(A,n-1);
            ll s=(ans.m[0][0]*2%mod+ans.m[0][1]%mod+ans.m[0][2]%mod+ans.m[0][3]%mod)%mod;
            cout<<s%mod<<endl;
    }
    return 0;
}


你可能感兴趣的:(hdu3306Another kind of Fibonacci(矩阵连乘&矩阵快速幂))