#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll p,n,m;
int K,b[20],c[20];
struct mat{
ll num[20][20];
void operator=(const mat tmp){for(int i=0; i<=K; ++i)for(int j=0; j<=K; ++j)num[i][j]=tmp.num[i][j];}
mat operator*(const mat tmp){
mat tt;
memset(tt.num,0,sizeof tt.num);
for(int i=0; i<=K; ++i)
for(int j=0; j<=K; ++j)
for(int k=0; k<=K; ++k)
tt.num[i][j]=(tt.num[i][j]+tmp.num[i][k]*num[k][j]%p)%p;
return tt;
}
};
mat Pow(mat a,ll b){
mat ans;
memset(ans.num,0,sizeof ans.num);
for(int i=0; i<=K; ++i)ans.num[i][i]=1;
while(b){
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}return ans;
}
ll solve(ll n){
ll t=0;
for(int i=1; i<=K; ++i)t=(t+b[i])%p;
if(n<=K){t=0;for(int i=1; i<=n; ++i)t=(t+b[i])%p;return t;}
mat tmp;memset(tmp.num,0,sizeof tmp.num);
tmp.num[0][0]=1;
for(int i=1; i<=K; ++i)tmp.num[0][i]=tmp.num[1][i]=c[K-i+1]%p;
for(int i=2; i<=K; ++i)tmp.num[i][i-1]=1;
mat ans;memset(ans.num,0,sizeof ans.num);
for(int i=1; i<=K; ++i)ans.num[i][0]=b[K-i+1]%p;
ans.num[0][0]=t;
tmp=Pow(tmp,n-K);
return (ans*tmp).num[0][0];
}
int main(){
scanf("%d",&K);
for(int i=1; i<=K; ++i)scanf("%d",&b[i]);
for(int i=1; i<=K; ++i)scanf("%d",&c[i]);
scanf("%lld%lld%lld",&m,&n,&p);
printf("%lld\n",(solve(n)-solve(m-1)+p)%p);
return 0;
}