Problem 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 could 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 9999 1 1 1 1 1 1 1 1 1 1 20 500 1 0 1 0 1 0 1 0 1 0
Sample Output
45 104、
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 10;
LL k, m;
struct mtx {
LL x[N + 1][N + 1];
mtx() {
memset(x, 0, sizeof x );
}
};
mtx operator *(const mtx &a, const mtx &b) {
mtx c;
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
for(int k = 0; k < N; ++k)
c.x[i][j] = (c.x[i][j] + a.x[i][k] * b.x[k][j]) % m;
}
}
return c;
}
mtx operator ^(mtx a, LL n) {
mtx ret;
for(int i = 0; i < N; ++i)
ret.x[i][i] = 1;
for(; n; n >>= 1) {
if(n & 1)
ret = ret * a;
a = a * a;
}
return ret;
}
int main() {
LL sum;
mtx tmp;
for(int i = 1; i < N; ++i)
tmp.x[i][i - 1] = 1;
while(cin >> k >> m) {
for(int i = 0; i < N; ++i)
cin >> tmp.x[0][i];
mtx ans = tmp ^ (k - 9);
sum = 0;
for(int i = 0; i < N; ++i)
sum = (sum + ans.x[0][i] * (N - 1 - i)) % m;
cout << sum << endl;
}
return 0;
}