举行加速

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

}

猜你喜欢

转载自www.cnblogs.com/Lamboofhome/p/11704415.html