Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7240 Accepted Submission(s): 4428
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
Author
linle
Source
Recommend
lcy | We have carefully selected several similar problems for you: 1588 3117 2276 2256 2604
Statistic | Submit | Discuss | Note
一道矩阵快速幂的题
系数矩阵为
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, mod;
struct M
{
int m[15][15];
};
M mul(M a, M b)
{
M ans;
for (int i = 0; i <= 9; i++)
for (int j = 0; j <= 9; j++)
{
ans.m[i][j] = 0;
for (int k = 0; k <= 9; k++)
ans.m[i][j] = (ans.m[i][j] + a.m[i][k] * b.m[k][j] % mod) % mod;
}
return ans;
}
void fpow(M a, int m)
{
M b;
for (int i = 0; i <= 9; i++)
for (int j = 0; j <= 9; j++)
b.m[i][j] = 0;
for (int i = 0; i <= 9; i++)
b.m[i][i] = 1;
while (m)
{
if (m & 1)
b = mul(b, a);
m >>= 1;
a = mul(a, a);
}
int ans = 0;
for (int i = 0; i <= 9; i++)
ans = (ans + b.m[0][i] * (9 - i) % mod) % mod;
cout << ans << endl;
}
int main(){
while (cin >> n >> mod)
{
M a;
for (int i = 0; i <= 9; i++)
for (int j = 0; j <= 9; j++)
a.m[i][j] = 0;
for (int i = 0; i <= 9; i++)
{
cin >> a.m[0][i];
if (i != 0)
a.m[i][i - 1] = 1;
}
n -= 9;
fpow(a, n);
}
return 0;
}