没有坑点,只要推出递推式就行。
因为:
所以可以得到这样的关系:
这样就可以推出递推式如下:
代码:
import java.util.*;
public class Main{
static Scanner sc = new Scanner(System.in);
static int m;
static long K, ans;
static long [][] init;
static long[][] mul(long[][] a, long[][] b) {
long [][] tmp = new long[10][10];
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
for(int k = 0; k < 10; k++) {
tmp[i][j] += (a[i][k] * b[k][j]) % m;
tmp[i][j] %= m;
}
}
}
return tmp;
}
static void pow(long [][] a, long x) {
long [][] res = new long[10][10];
for(int i = 0; i < 10; i++) res[i][i] = 1;
while(x > 0) {
if((x&1) == 1)
res = mul(res, a);
a = mul(a,a);
x >>= 1;
}
ans = 0;
for(int i = 0; i < 10; i++) {
ans += (res[0][i] * (9-i))%m;
ans %= m;
}
}
public static void main(String[] args) {
while(sc.hasNext()) {
K = sc.nextLong(); m = sc.nextInt();
init = new long[10][10];
for(int i = 0; i < 10; i++) { //initialization
if(i < 9)
init[i+1][i] = 1;
init[0][i] = sc.nextLong();
}
pow(init, K - 9);
System.out.println(ans);
}
System.exit(0);
}
}