A Simple Math Problem
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<bits/stdc++.h>
using namespace std;
using LL=int64_t;
const int INF=0x3f3f3f3f;
int mod;
struct Node {
LL m[12][12];
}sum,base;
Node muilt(Node a,Node b) {
Node temp;
for(int i=0;i<=9;i++) {
for(int j=0;j<=9;j++) {
temp.m[i][j]=0;
for(int k=0;k<=9;k++) {
temp.m[i][j]=(a.m[i][k]*b.m[k][j]+temp.m[i][j])%mod;
}
}
}
return temp;
}
LL q_mod(Node base,LL n) {
memset(sum.m,0,sizeof(sum.m));
for(int i=0;i<=9;i++)
sum.m[i][i]=1;
while(n) {
if(n&1) sum=muilt(base,sum);
n>>=1;
base=muilt(base,base);
}
LL ans=0;
for(int i=0;i<=9;i++)
ans=(sum.m[0][i]*(9-i)+ans)%mod;
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
LL k;
while(cin>>k>>mod) {
if(k<10) {
cout<<k<<endl;
continue;
}
memset(base.m,0,sizeof(base.m));
for(int i=0;i<=9;i++)
cin>>base.m[0][i];
for(int i=1;i<=9;i++)
base.m[i][i-1]=1;
cout<<q_mod(base,k-9)<<endl;
}
return 0;
}