#include<bits/stdc++.h> using namespace std; const int maxd = 100 + 4; int d, n, m; typedef long long Matrix[maxd][maxd]; typedef long long Vector[maxd]; Vector a, f; //务必秉承不修改原变量的思想。因此开辟t这个辅助空间。 //因为有可能R和A都是指向同一块内存的两个指针,如果修改了R,则也修改了A,将导致错误。 void matrix_mul(Matrix A, Matrix B, Matrix R) { Matrix t; memset(t, 0, sizeof(t)); for(int i = 0; i < d; i++){ for(int j = 0; j < d; j++){ for(int k = 0; k < d; k++){ t[i][j] = (t[i][j] + A[i][k]*B[k][j]) % m; } } } memcpy(R, t, sizeof(t)); } void matrix_pow(Matrix A, int n, Matrix R) { Matrix a, r; //cout << sizeof(a) << ' ' << sizeof(A) << endl; memcpy(a, A, sizeof(a)); memset(r, 0, sizeof(r)); for(int i = 0; i < d; i++) r[i][i] = 1; while(n){ if(n&1){ matrix_mul(r, a, r); } n >>= 1; matrix_mul(a, a, a); } memcpy(R, r, sizeof(r)); } void matrix_mul_vector(Matrix A, Vector V, Vector R) { Vector v; memset(v, 0, sizeof(v)); for(int i = 0; i < d; i++){ for(int j = 0; j < d; j++) v[i] = (v[i] + A[i][j]*V[j]) % m; } memcpy(R, v, sizeof(v)); } int main() { while(cin >> d >> n >> m && d){ for(int i = 0; i < d; i++) cin >> a[i]; for(int i = 0; i < d; i++) cin >> f[i]; Matrix A; memset(A, 0, sizeof(A)); for(int i = 0; i < d; i++){ A[d-1][i] = a[d-i-1]; if(i != 0) A[i-1][i] = 1; } matrix_pow(A, n - d, A); matrix_mul_vector(A, f, f); cout << f[d-1] << endl; } return 0; } /* 3 3 3 1 2 1 2 3 1 1 2 3 */