= =套个模板
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=16;
struct Matrix
{
long long m[maxn][maxn];
};
long long x[16];
long long d,n,m;
Matrix P;
Matrix I=
{
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
};
Matrix Matrixmul(Matrix a,Matrix b)
{
int i,j,k;
Matrix c;
for(int i=0; i<d; i++)
{
for(int j=0; j<d; j++)
{
c.m[i][j]=0;
for(int k=0; k<d; k++)
{
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%m;
}
c.m[i][j]%=m;
}
}
return c;
}
Matrix quickpow(long long n)
{
Matrix m=P,b=I;
while(n>=1)
{
if(n&1)
{
b=Matrixmul(b,m);
}
n=n>>1;
m=Matrixmul(m,m);
}
return b;
}
int main()
{
while(scanf("%lld%lld%lld",&d,&n,&m)!=-1)
{ memset(P.m,0,sizeof(P.m));
for(int i=1;i<d;i++)
P.m[i][i-1]=1;
long long ans=0;
if(d==0&&n==0&&m==0)
break;
for(int i=0; i<d; i++)
{
scanf("%lld",&P.m[0][i]);
P.m[0][i]%=m;
}
if(n>d)
{
for(int i=d-1; i>=0; i--)
{
scanf("%lld",&x[i]);
x[i]%=m;
}
Matrix t=quickpow(n-d);
for(int i=0; i<d; i++)
ans+=x[i]*t.m[0][i];
}
else
{
for(int i=0; i<d; i++)
{
scanf("%lld",&x[i]);
}
ans=x[n-1];
}
printf("%lld\n",ans%m);
}
return 0;
}