HDU 6050 Funny Function(矩阵)

来源:互联网 发布:重庆理工大学网络教育 编辑:程序博客网 时间:2024/05/21 18:41
#include<cstdio>#include<cstring>#include<iostream>const int mod=1e9+7;using namespace std;typedef long long LL;LL n,m;struct Matrix{    LL mat[2][2];    Matrix operator -(Matrix &tmp)    {        Matrix res;        for(int i=0; i<2; i++)            for(int j=0; j<2; j++)            {                res.mat[i][j]=mat[i][j]-tmp.mat[i][j]+mod;                res.mat[i][j]%=mod;            }        return res;    }    Matrix operator *(Matrix &tmp)    {        Matrix res;        memset(res.mat,0,sizeof(res.mat));        for(int i=0; i<2; ++i)            for(int j=0; j<2; ++j)                for(int k=0; k<2; ++k)                {                    res.mat[i][j]+=mat[i][k]*tmp.mat[k][j];                    res.mat[i][j]%=mod;                }        return res;    }};Matrix pow_M(Matrix a,LL n){    Matrix ret;    memset(ret.mat,0,sizeof(ret.mat));    ret.mat[0][0]=ret.mat[1][1]=1;    Matrix temp=a;    while(n)    {        if(n&1)ret=ret*temp;        temp=temp*temp;        n>>=1;    }    return ret;}LL pow_m(LL a,LL n){    LL ret=1;    LL temp=a%mod;    while(n)    {        if(n&1)        {            ret*=temp;            ret%=mod;        }        temp*=temp;        temp%=mod;        n>>=1;    }    return ret;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%I64d %I64d",&n,&m);        Matrix A,B,C;        A.mat[0][0]=0;        A.mat[0][1]=2;        A.mat[1][0]=1;        A.mat[1][1]=1;        if(n&1)        {            B.mat[0][0]=-1;            B.mat[0][1]=2;            B.mat[1][0]=1;            B.mat[1][1]=0;        }        else        {            B.mat[0][0]=1;            B.mat[0][1]=0;            B.mat[1][0]=0;            B.mat[1][1]=1;        }        C=pow_M(pow_M(A,n)-B,m-1);        printf("%I64d\n",(C.mat[0][0]+C.mat[1][0])%mod);    }}
原创粉丝点击