#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Matrix {
int mt[20][20];
int r, c;
}MT;
int m, kk, v[10];
//构造一个单位矩阵
MT init_E(MT A)
{
A.r = 10;
A.c = 10;
for( int i = 0; i < A.r; i++) {
for( int j = 0; j < A.c; j++) {
if ( i == j)
A.mt[i][j] = 1;
else
A.mt[i][j] = 0;
}
}
return A;
}
MT init_N_1(MT A)
{
A.r = 10;
A.c = 10;
for( int i = 0; i < A.r; i++)
for( int j = 0; j < A.c; j++) {
if ( i == j ) {
A.mt[i][j+1] = 1;
A.mt[i][j] = 0;
}
}
for( int i = 0, j = 9; i < 10 && j >= 0; i++, j--)
A.mt[9][i] = v[j];
return A;
}
MT init_N_2(MT A)
{
A.r = 10;
A.c = 1;
for( int i = 0; i < A.r; i++)
A.mt[i][0] = i;
return A;
}
MT mul(MT A, MT B)
{
MT C;
C.r = A.r , C.c = B.c;
for( int i = 0;i < A.r; i++) {
for( int j = 0; j < B.c; j++) {
int c = 0;
for( int k = 0; k < A.c; k++) {
c = c % kk + ((A.mt[i][k] % kk) * (B.mt[k][j] % kk)) % kk;
c %= kk;
}
C.mt[i][j] = c % kk;
}
}
return C;
}
MT quickpow( MT A, MT B, MT C)
{
while( m ) {
if ( m % 2 == 1)
B = mul(A,B);
m = m / 2;
A = mul(A, A);
}
C = mul(B, C);
return C;
}
/*
void print(MT A)
{
puts("");
for( int i = 0; i < A.r; i++) {
for( int j = 0; j < A.c; j++)
printf("%d ", A.mt[i][j]);
puts(" ");
}
}
*/
int main( )
{
while( scanf("%d%d", &m, &kk) != EOF ) {
MT A, B, C, D;
for( int i = 0; i < 10; i++)
scanf("%d", &v[i]);
if ( m < 10 )
printf("%d\n", m % kk);
else {
B = init_E(B);
// print(B);
C = init_N_2(C);
// print(C);
A = init_E(A);
A = init_N_1(A);
// print(A);
D = quickpow( A, B, C);
// print(D);
printf("%d\n", D.mt[0][0]);
}
}
return 0;
}