nefu 457(矩阵连乘)

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=457

这类题目一般都有如下提示  n比较大  结果需要取模

解这类题目的思路就是找到转移方程 然后根据转移方程找到转移矩阵 然后套模板求解。

nefu 457(矩阵连乘)_第1张图片

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int mod = 1e7;
struct matrix
{
    ll m[3][3];
};
matrix A;
matrix I={
   1,0,0,
   0,1,0,
   0,0,1
};
matrix multi(matrix a,matrix b)
{
    matrix c;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++){
                c.m[i][j]=0;
            for(int k=0;k<3;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()
{
    int t,a,b,p,q,s,e;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d%d%d",&a,&b,&p,&q,&s,&e);
        A.m[0][0]=1;A.m[0][1]=p;A.m[0][2]=q;
        A.m[1][0]=0;A.m[1][1]=p;A.m[1][2]=q;
        A.m[2][0]=0;A.m[2][1]=1;A.m[2][2]=0;
        s--;
        int s1,s2;
        if(s<0)  s1=0;
        else if(s==0)  s1=a;
        else{
            matrix ans=power(A,s-1);
            s1=(ans.m[0][0]%mod*(a+b)%mod+ans.m[0][1]%mod*b%mod+ans.m[0][2]%mod*a%mod)%mod;
        }
        if(e==0)  s2=a;
        else{
            matrix ans=power(A,e-1);
            s2=(ans.m[0][0]%mod*(a+b)%mod+ans.m[0][1]%mod*b%mod+ans.m[0][2]%mod*a%mod)%mod;
        }
        ll l=((s2-s1)%mod+mod)%mod;
        cout<<l<<endl;
    }
    return 0;
}


你可能感兴趣的:(nefu 457(矩阵连乘))