A Simple Math Problem
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 24 Accepted Submission(s) : 16
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.
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.
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
2007省赛集训队练习赛(6)_linle专场
#include<stdio.h>
#include<string.h>
int A[10][10], B[10][10], M;
void mul(int X[10][10], int Y[10][10])
{
int Z[10][10];
int i, j, k;
memset(Z, 0, sizeof(Z));
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
for (k = 0; k < 10; k++)
Z[i][j] = (Z[i][j] + X[i][k] * Y[k][j] % M) % M;
memcpy(X, Z, sizeof(Z));
}
int f(int n)
{
int i;
if (0<=n&&n<=9 )
return n;
n-=9;
memset(B, 0, sizeof(B));
for (i = 0; i < 10; i++)
B[i][i] = 1;
while (n)
{
if (n & 1) mul(B, A);
mul(A, A);
n >>= 1;
}
return B[0][0] * 9 + B[0][1] * 8 + B[0][2] * 7 + B[0][3] * 6 + B[0][4] * 5 + B[0][5] * 4 + B[0][6] * 3 + B[0][7] * 2 + B[0][8] * 1 + B[0][9] * 0;
}
int main()
{
int i, k, b, n, sum,j;
while (scanf("%d%d", &k, &M) != EOF)
{
for (i = 0; i < 10;i++)
scanf("%d", &A[0][i]);
for (i = 1; i < 10; i++)
for (j = 0; j < 10; j++)
{
if (j == i - 1)
A[i][j] = 1;
else
A[i][j] = 0;
}
printf("%d\n", f(k)%M);
}
return 0;
}