样例过了
#include<bits/stdc++.h>
const int N=18;
long long m,k,n,a[N][N],g[N][N],ans[N][N],f[N][N],b[N],c[N],Q;
long long matrix_pow(long long m)
{
memset(a,0,sizeof(a)*4);
for(int i=2;i<=k+1;i++) ans[1][i]=b[i-1],ans[1][1]+=b[i-1],a[i][1]=a[i][2]=c[i-1],a[i][i+1]=i<=k?1:0;
a[1][1]=1;
// for(int i=1;i<=k+1;i++)
// for(int j=1;j<=k+1;j++) printf("%d%c",a[i][j]," \n"[j==k+1]);
// for(int i=1;i<=k+1;i++) printf("%d%c",ans[1][i]," \n"[i==k+1]);
m-=k;
while(m)
{
// for(int i=1;i<=k+1;i++)
// for(int j=1;j<=k+1;j++) printf("%d%c",a[i][j]," \n"[j==k+1]);
// for(int i=1;i<=k+1;i++) printf("%d%c",ans[1][i]," \n"[i==k+1]);
// puts("**********************");
if(m&1)
{
long long g[N][N]={};
for(int i=1;i<=k+1;i++)
for(int l=1;l<=k+1;l++)
for(int j=1;j<=k+1;j++)
g[i][j]=(g[i][j]+ans[i][l]*a[l][j])%Q;
memcpy(ans,g,sizeof(g));
}
// for(int i=1;i<=k+1;i++)
// for(int j=1;j<=k+1;j++) printf("%d%c",a[i][j]," \n"[j==k+1]);
// for(int i=1;i<=k+1;i++) printf("%d%c",ans[1][i]," \n"[i==k+1]);
// puts("**********************");
long long f[N][N]={};
for(int i=1;i<=k+1;i++)
for(int l=1;l<=k+1;l++)
for(int j=1;j<=k+1;j++)
f[i][j]=(f[i][j]+a[i][l]*a[l][j])%Q;
memcpy(a,f,sizeof(f));
m>>=1;
}
// printf("****%lld %lld****\n",m,ans[1][1]);
return ans[1][1];
}
int main()
{
scanf("%lld",&k);
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,&Q);
long long s=0;
if(n<=k)
{
for(int i=m;i<=n;i++) s+=b[i];
printf("%lld\n",s);
return 0;
}
if(m<=k){for(int i=m;i<=k;i++) s+=b[i];m=k+1;}
printf("%lld\n",s+matrix_pow(n)-matrix_pow(m-1));
return 0;
}