nefu 457(矩阵连乘)

来源:互联网 发布:mysql 存储过程 函数 编辑:程序博客网 时间:2024/04/30 08:18

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

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

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


代码如下:

#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;}


0 0