1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5 #define LL long long
6 using namespace std;
7 const int N = 10;//矩阵大小
8 int mod;
9 int k;//矩阵的幂
10 int a[15];
11
12 struct Matrix
13 {
14 LL mat[N][N];//二维数组存储矩阵
15 Matrix operator*(const Matrix &m)const
16 {
17 Matrix temp;
18 for(int i = 0; i < N;i++)
19 {
20 for(int j = 0; j < N; j++)
21 {
22 temp.mat[i][j] = 0;
23 for(int k = 0; k < N; k++)
24 {
25 temp.mat[i][j]+=mat[i][k]*m.mat[k][j]%mod;
26 temp.mat[i][j]%=mod;
27 }
28 }
29 }
30 return temp;
31 }
32
33 };
34 void Init(Matrix &m)
35 {
36 memset(m.mat,0,sizeof(m.mat));
37 for(int i = 0; i < N;i++)
38 m.mat[0][i] = a[i];
39 for(int i = 1; i < N; i++)
40 {
41 m.mat[i][i-1] = 1;
42 }
43 }
44 LL qpow(Matrix &m,LL k)
45 {
46 Matrix ans;
47 memset(ans.mat,0,sizeof(ans.mat));
48 for(int i = 0; i < N; i++)
49 ans.mat[i][i] = 1;
50 while(k)
51 {
52 if(k&1)ans = ans * m;
53 m = m*m;
54 k>>=1;
55 }
56 LL sum = 0;
57 int f[10];
58 for(int i = 0; i < N; i++)
59 f[i] = N-i-1;
60 for(int i = 0; i < N; i++)
61 {
62 sum+=ans.mat[0][i]*f[i]%mod;
63 sum%=mod;
64 }
65 return sum%mod;
66 }
67 int main()
68 {
69 while(scanf("%d%d",&k,&mod)!=EOF)
70 {
71 for(int i = 0; i <= 9; i++)
72 scanf("%d",&a[i]);
73 if(k<10)
74 {
75 printf("%d\n",k%mod);
76 }
77 else
78 {
79 Matrix m;
80 Init(m);
81 cout<<qpow(m,k-9)<<endl;
82 }
83 }
84 return 0;
85 }