题目链接: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; }