矩阵快速幂的模板题 构造矩阵
0 0 0 0 0 0 ad
1 0 0 0 0 0 a(d-1)
...........
0 0 0 0 0 1 a(n-1 )
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
#define MAXN 20
#define MAXM 20
typedef long long LL;
struct Maxtrix{
int n, m;
LL A[MAXN+10][MAXN+10];
};
LL a[MAXN+10], f[MAXN+10];
int n, d;
LL p;
Maxtrix A, B, C, E;
void init(Maxtrix &X)
{
X.n = X.m = 0;
memset(X.A, 0, sizeof(X.A));
}
void Get_E()
{
E.n = E.m = MAXN;
for(int i = 0; i < E.n; i++)
E.A[i][i] = 1;
}
Maxtrix mul(Maxtrix AA, Maxtrix BB)
{
Maxtrix D;
init(D);
D.n = AA.n;
D.m = BB.m;
for(int i = 0; i < AA.n; i++)
for(int j = 0; j < BB.n; j++)
for(int k = 0; k < BB.m; k++)
{
D.A[i][k] += (AA.A[i][j] * BB.A[j][k]) % p;
D.A[i][k] %= p;
}
return D;
}
Maxtrix pow_mod(Maxtrix &A, int k)
{
Maxtrix ans = E, t = A;
ans.n = A.n;
ans.m = A.m;
while(k)
{
if(k & 1)
ans = mul(ans, t);
t = mul(t, t);
k >>= 1;
}
return ans;
}
int main()
{
Get_E();
while(cin >> d >> n >> p && d+n+p)
{
for(int i = 0; i < d; i++) cin >> a[i];
for(int i = 0; i < d; i++) cin >> f[i];
init(A);
A.n = 1;
A.m = d;
for(int i = 0; i < d; i++)
A.A[0][i] = f[i];
init(B);
B.n = B.m = d;
for(int i = 0; i < d; i++)
B.A[i+1][i] = 1;
for(int i = d-1; i >= 0; i--)
B.A[i][d-1] = a[d-i-1];
Maxtrix tmp = pow_mod(B, n-d);
Maxtrix ans = mul(A, tmp);
cout << ans.A[0][d-1] << '\n';
}
}
/*
2 10 100
1 1
1 1
3 2147483647 12345
12345678 0 12345
1 2 3
0 0 0
*/