1 /*UVA10870:
2 矩阵快速幂与递推公式的关系:关键就是这句话,以后做题能联想到即可
3 f(n)=a1f(n-1)+...adf(n-d)
4 */
5 #include<iostream>
6 #include<stdio.h>
7 #include<string.h>
8 #include<algorithm>
9 #include<stdlib.h>
10 #include<math.h>
11 #include<queue>
12 #include<vector>
13 #include<map>
14 #define ULL unsigned long long
15 #define LL long long
16 #define Max_size 17
17
18 using namespace std;
19
20 int d,n,MOD;//
21 struct Mat
22 {
23 LL mat[Max_size][Max_size];
24
25 };
26 Mat operator*(Mat a,Mat b)
27 {
28 Mat c;
29 memset(c.mat,0,sizeof(c.mat));
30 for (int i=0;i<d;i++)
31 for (int j=0;j<d;j++)
32 for (int k=0;k<d;k++)
33 if (a.mat[i][k] && b.mat[k][j])
34 c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD;
35 return c;
36 }
37 Mat operator+(Mat a,Mat b)
38 {
39 Mat c;
40 memset(c.mat,0,sizeof(c.mat));
41 for (int i=0;i<d;i++)
42 for (int j=0;j<d;j++)
43 c.mat[i][j]=(a.mat[i][j]+b.mat[i][j])%MOD;
44 return c;
45 }
46 Mat E;
47
48 void builtE()
49 {
50 memset(E.mat,0,sizeof(E.mat));
51 for (int i=0;i<Max_size;i++)
52 {
53 E.mat[i][i]=1;
54 }
55 }
56 Mat operator^(Mat A,int x)
57 {
58 Mat c;
59 builtE();
60 c=E;
61 for ( ; x; x>>=1)
62 {
63 if ( x & 1)
64 c = c * A;
65 A = A * A;
66 }
67 return c;
68 }
69 Mat K,F;
70 int main()
71 {
72 while(cin>>d>>n>>MOD)
73 {
74 memset(K.mat,0,sizeof(K.mat));
75 memset(F.mat,0,sizeof(F.mat));
76 for(int i=d-1;i>=0;i--) cin>>K.mat[i][d-1];
77 for(int i=0;i<d;i++) K.mat[i+1][i]=1;
78 K=K^(n-1);
79 for(int i=0;i<d;i++) cin>>F.mat[0][i];
80 F=F*K;
81 cout<<F.mat[0][0]<<endl;
82 }
83 return 0;
84 }