求助,样例过了的我瑟瑟发抖。
跪求你谷的列文虎克帮助
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=25;
int L,k;
ll n,m,mod;
ll b[N],c[N];
struct Matrix
{
ll M[N][N];
void clear(){memset(M,0,sizeof(M));}
void reset(){for(int i=1;i<=L;i++)M[i][i]=1;}
Matrix(bool isT){clear();if(isT)reset();}
Matrix friend operator *(const Matrix A,const Matrix B)
{
Matrix Ans(0);
for(int i=1;i<=L;i++)
for(int j=1;j<=L;j++)
for(int k=1;k<=L;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j])%mod;
return Ans;
}
void print()
{
for(int i=1;i<=L;i++)
{
for(int j=1;j<=L;j++)
printf("%lld ",M[i][j]);
printf("\n");
}
printf("\n");
}
};
Matrix ans(0),a(0);
ll ans1,ans2;
Matrix QuickPow(Matrix T,ll p)
{
Matrix Ans(1);
while(p)
{
if(p&1)Ans=Ans*T;
T=T*T;p>>=1;
}
return Ans;
}
void init()
{
for(int i=1,j=k;j;i++,j--)
{
ans.M[i+1][1]=b[j];
ans.M[1][1]=(ans.M[1][1]+b[j])%mod;
}
a.M[1][1]=1;
for(int i=1;i<=k;i++)a.M[1][i+1]=a.M[2][i+1]=c[i];
for(int i=3;i<=k+1;i++)a.M[i][i-1]=1;
}
ll solve(ll x)
{
if(x<=k)
{
ll res=0;
for(int i=1;i<=x;i++)res=(res+b[i])%mod;
return res;
}
init();
a=QuickPow(a,x-k);
ans=a*ans;
return ans.M[1][1];
}
int main(){
scanf("%d",&k);L=k+1;
for(int i=1;i<=k;i++)scanf("%lld",&b[i]);
for(int i=1;i<=k;i++)scanf("%lld",&c[i]);
scanf("%lld%lld%lld",&m,&n,&mod);
for(int i=1;i<=k;i++)b[i]%=mod,c[i]%=mod;
ans1=solve(n);ans2=solve(m-1);
printf("%lld",(ans1-ans2+mod)%mod);
return 0;
}