代码如下:
#include <iostream>
#include <vector>
using namespace std;
const int MOD = 998244353;
vector<vector<int>> ml(const vector<vector<int>>& A, const vector<vector<int>>& B, int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
for (int t = 0; t < n; ++t) {
res[i][j] = (res[i][j] + 1LL * A[i][t] * B[t][j] % MOD) % MOD;
}
}
}
return res;
}
vector<vector<int>> ix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
for (int i = 0; i < n; ++i) {
res[i][i] = 1;
}
return res;
}
vector<vector<int>> mw(vector<vector<int>> mx, int p, int n) {
if (p == 0) {
return ix(n);
}
if (p % 2 == 0) {
vector<vector<int>> h_p = mw(mx, p / 2, n);
return ml(h_p, h_p, n);
} else {
vector<vector<int>> h_p = mw(mx, p - 1, n);
return ml(h_p, mx, n);
}
}
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
vector<vector<int>> m_a(n, vector<int>(n, 0));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
m_a[i][j] = 1LL * a[i] * b[j] % MOD;
}
}
vector<vector<int>> r_m = mw(m_a, k, n);
int s_v = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
s_v = (s_v + r_m[i][j]) % MOD;
}
}
cout << s_v << endl;
return 0;
}