bzoj4128 Matrix

封装一个矩阵类去跑 \(\text{BSGS}\) 算法就好。
注意要写矩阵求逆,这里也封装起来了。

Code

int B;
mat pw1[1000], pw2[1000], I, O, b;
map <mat, int> S;
int main() {
	#ifdef ldxcaicai
	freopen("lx.in", "r", stdin);
	#endif
	B = read(), mod = read();
	int T = sqrt(mod) + 1;
	for (int i = 0; i < B; ++i) I[i][i] = 1;
	pw1[0] = pw2[0] = I;
	pw1[1].rd();
	for (int i = 2; i <= T; ++i) pw1[i] = pw1[i - 1] * pw1[1];
	pw2[1] = getinv(pw1[T]);
	for (int i = 2; i <= T; ++i) pw2[i] = pw2[i - 1] * pw2[1];
	for (int i = 0; i <= T; ++i) {
		if (S.count(pw1[i])) continue;
		S[pw1[i]] = i;
	}
	b.rd();
	for (int i = 0; i <= T; ++i) {
		mat t = b * pw2[i];
		if (S.count(t)) {
			cout << i * T + S[t];
			return 0;
		} 
	}
	return 0;
}
posted @ 2021-12-13 21:21  soroboruo  阅读(42)  评论(0编辑  收藏  举报