20pts,求调,玄关
查看原帖
20pts,求调,玄关
1023774
rui_de_aihao楼主2024/12/28 22:25

代码如下:

#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;
}

20pts!!!

2024/12/28 22:25
加载中...