首页 > 代码库 > HIT 2255 Not Fibonacci(矩阵快速幂)
HIT 2255 Not Fibonacci(矩阵快速幂)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int mod=10000000; struct mat { long long t[3][3]; void set() { memset(t,0,sizeof(t)); } } a,b; mat multiple(mat a,mat b,int n,int p) { int i,j,k; mat temp; temp.set(); for(i=0; i<n; i++) for(j=0; j<n; j++) { //if(a.t[i][j]!=0) for(k=0; k<n; k++) temp.t[i][k]=(temp.t[i][k]+a.t[i][j]*b.t[j][k]+p)%p; } return temp; } mat quick_mod(mat b,int n,int m,int p) { mat t; t.set(); for(int i=0;i<n;i++) t.t[i][i]=1; while(m) { if(m&1) { t=multiple(t,b,n,p); } m>>=1; b=multiple(b,b,n,p); } return t; } void init(int p,int q) { b.set(); b.t[0][0]=1; b.t[1][2]=q; b.t[2][0]=1; b.t[2][1]=1; b.t[2][2]=p; } int main() { int A,B,p,q,s,e,t; cin>>t; while(t--) { cin>>A>>B>>p>>q>>s>>e; long long l,r; s--; if(s<0) l=0; else if(s==0) l=A; else if(s==1) l=B+A; else { init(p,q); a=quick_mod(b,3,s,mod); l=((A*a.t[0][0]+A*a.t[1][0]+B*a.t[2][0])%mod+mod)%mod; } if(e==0) r=A; else if(e==1) r=B+A; else { init(p,q); a=quick_mod(b,3,e,mod); r=((A*a.t[0][0]+A*a.t[1][0]+B*a.t[2][0])%mod+mod)%mod; } cout<<(r-l+mod)%mod<<endl; } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。