Hdu1757 -- A Simple Math Problem (Rapid matrix Power Optimization)
A Simple Math Problem
Time Limit:1000 MS
Memory Limit:32768KB
64bit IO Format:% I64d & % I64uSubmit Status
Description
Lele now is thinking about a simple function f (x ).
If x <10 f (x) = x.
If x> = 10 f (x) = a0 * f (x-1) + a1 * f (X-2) + a2 * f (X-3) + ...... + A9 * f (X-10 );
And ai (0 <= I <= 9) can only be 0 or 1.
Now, I will give a0 ~ A9 and two positive integers k and m, and cocould you help Lele to caculate f (k) % m.
Input
The problem contains mutiple test cases. Please process to the end of file.
In each case, there will be two lines.
In the first line, there are two positive integers k and m. (k <2*10 ^ 9, m <10 ^ 5)
In the second line, there are ten integers represent a0 ~ A9.
Output
For each case, output f (k) % m in one line.
Sample Input
10 99991 1 1 1 1 1 1 1 1 120 5001 0 1 0 1 0 1 0 1 0
Sample Output
45104
<喎?http: www.bkjia.com kf ware vc " target="_blank" class="keylink"> VcD4KPHA + PC9wPgo8cHJlIGNsYXNzPQ = "brush: java;"> # include # Include # Include using namespace std; # define LL _ int64struct node {LL a [12] [12]; int n ;}; node mul (node p, node q, LL m) {int I, j, k; node s; s. n = p. n; for (I = 0; I <p. n; I ++) for (j = 0; j <p. n; j ++) {s. a [I] [j] = 0; for (k = 0; k <p. n; k ++) s. a [I] [j] = (s. a [I] [j] + p. a [I] [k] * q. a [k] [j]) % m;} return s;} node pow (node p, LL k, LL m) {if (k = 1) return p; node s = pow (p, k/2, m); s = mul (s , S, m); if (k % 2) {s = mul (s, p, m);} return s;} int main () {LL k, m, ans; int I, j; node p, s; while (scanf ("% I64d % I64d", & k, & m )! = EOF) {if (k <10) {printf ("% I64d \ n", k); continue;} ans = 0; p. n = 10; for (I = 0; I <10; I ++) {for (j = 0; j <10; j ++) p. a [I] [j] = 0; p. a [I] [I + 1] = 1 ;}for (I = 0; I <10; I ++) scanf ("% I64d", & p. a [I] [0]); s = pow (p, K-9, m); for (I = 0; I <10; I ++) ans = (ans + (9-i) * s. a [I] [0]) % m; printf ("% I64d \ n", ans);} return 0 ;}