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 ",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 }