举行加速
作者:互联网
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<stack> #define M 31 #define ll long long using namespace std; struct mat{ ll s[M][M]; }l,A,B,C; int n,m,mod; mat II_MAT(int x) { for(register int j=0;j<x;j++) for(register int i=0;i<x;i++) { l.s[j][i]=0; } return l; } mat operator *(mat A,mat B) { for(register int i=0;i<n;i++) { for(register int j=0;j<n;j++) { C.s[i][j]=0; for(register int k=0;k<n;k++) C.s[i][j]=((A.s[i][k]*B.s[k][j])%mod+C.s[i][j])%mod; } } return C; } mat operator +(mat A,mat B) { C=A; for(register int i=0;i<n;i++) { for(register int j=0;j<n;j++) { C.s[i][j]=(C.s[i][j]+B.s[i][j])%mod; } } return C; } mat ans; int p,kai; int main(){ scanf("%d",&m); while(m--) { scanf("%d",&n); A=II_MAT(n); ans=II_MAT(n); for(register int i=n-1;i>=0;i--) { scanf("%d",&ans.s[0][i]); } for(register int i=0;i<n;i++) scanf("%d",&A.s[i][0]); for(register int i=0,j=1;j<n;i++,j++) A.s[i][j]=1; scanf("%d%d%d",&kai,&p,&mod); for(register int i=0,j=n-1;j>=0;i++,j--) { sum[i+1]=(sum[i-1]+ans.s[0][j])%mod; } if(p<=n) printf("%d\n",(sum[p]-sum[kai-1]+mod)%mod); // -1 guan jian else { p=p-n; while(p) { if(p&1) ans=ans*A; p=p/2; A=A*A; } printf("%d\n",ans.s[0][0]%mod); } } }
标签:int,ll,register,long,举行,sum,include,加速 来源: https://www.cnblogs.com/Lamboofhome/p/11704415.html