题目大意:
解题思路:
f
n
f_n
fn一定是由
f
1
c
1
×
f
2
c
2
×
…
…
×
f
k
c
k
f_1^{c_1}\times f_2^{c_2}\times …… \times f_k^{c_k}
f1c1×f2c2×……×fkck
然后我们用矩乘求
c
i
c_i
ci就好了
模数是
p
−
1
p-1
p−1(费马小)
A c c e p t e d c o d e : Accepted\ code: Accepted code:
#include<cstdio>
#include<cstring>
#define ll long long
const int p = 998244353;
struct matrix {
int a[201][201];
};
int n, k;
int b[201], f[400001];
matrix c, d;
matrix operator *(matrix &a, matrix &b){
memset(c.a, 0, sizeof(c.a));
for (int i = 1; i <= k; i++)
for (int j = 1; j <= k; j++)
for (int l = 1; l <= k; l++)
c.a[i][j] = (c.a[i][j]+(ll)a.a[i][l]*b.a[l][j]) % (p-1);
return c;
}
int ksm2(ll x, int m) {
ll ans = 1;
while (m) {
if (m & 1) ans = ans * x % p;
x = x * x % p;
m >>= 1;
}
return ans;
}
matrix ksm(int m) {
matrix ans;
memset(ans.a, 0, sizeof(ans.a));
for (int i = 1; i <= k; i++)
ans.a[i][i] = 1;
while (m) {
if (m & 1) ans = ans * d;
d = d * d;
m >>= 1;
}
return ans;
}
signed main() {
scanf("%d %d", &n, &k);
for (int i = 1; i <= k; i++)
scanf("%d", &b[i]);
for (int i = 1; i <= k; i++)
scanf("%d", &f[i]);
if (n <= k) {
printf("%d", f[n]);
return 0;
}
for (int i = 1; i <= k; i++)
d.a[i-1][i] = (i != 1), d.a[k][i] = b[k-i+1];
d = ksm(n - k);
ll ans = 1;
for (int i = 1; i <= k; i++)
ans = ans * ksm2(f[i], d.a[k][i]) % p;
printf("%d", ans);
}