因为怕溢出所以就全开ull了
#include<bits/stdc++.h>
#define ull unsigned long long
#define K 20
using namespace std;
ull k,mod;
ull l,r;
ull b[K],c[K];
struct mat{
ull n,m;
ull a[K][K]={};
void times(mat u){
m=u.m;
ull b[K][K]={};
for(ull i=1;i<=n;i++)
for(ull j=1;j<=m;j++)
for(ull y=1;y<=u.n;y++){
b[i][j]+=a[i][y]*u.a[y][j]%mod;
b[i][j]%=mod;
}
for(ull i=1;i<=n;i++)
for(ull j=1;j<=m;j++)
a[i][j]=b[i][j];
}
}a,base,unit;
void input(){
scanf("%lld",&k);
for(ull i=1;i<=k;i++)
scanf("%lld",&b[i]);
for(ull i=1;i<=k;i++)
scanf("%lld",&c[i]);
scanf("%lld%lld%lld",&l,&r,&mod);
}
void create_a(){
a.n=1,a.m=k+1;
for(ull i=1;i<=k;i++)
a.a[1][i]=b[i];
for(ull i=1;i<k;i++){
a.a[1][k+1]+=b[i];
a.a[1][k+1]%=mod;
}
}
void create_base(){
base.n=base.m=k+1;
for(ull i=1;i<k;i++)
base.a[i+1][i]=1;
for(ull i=1;i<=k;i++)
base.a[i][k]=c[k-i+1];
base.a[k][k+1]=1;
base.a[k+1][k+1]=1;
}
void create_unit(){
unit.n=unit.m=k+1;
for(ull i=1;i<=k+1;i++)
unit.a[i][i]=1;
}
void init(){
input();
create_base();
create_unit();
}
mat qpow(mat u,ull v){
mat re=unit;
while(v){
if(v&1)
re.times(u);
u.times(u);
v>>=1;
}
return re;
}
int main(){
init();
ull sum1=0,sum2=0;
if((l-1)-k+1){
create_a();
a.times(qpow(base,(l-1)-k+1));
sum1=a.a[1][k+1];
}
else
for(ull i=1;i<l;i++){
sum1+=b[i];
sum1%=mod;
}
//sum[l-1]
if(r-k+1){
create_a();
a.times(qpow(base,r-k+1));
sum2=a.a[1][k+1];
}
else
for(ull i=1;i<=r;i++){
sum2+=b[i];
sum2%=mod;
}
//sum[r]
printf("%lld",(sum2-sum1+mod)%mod);
}