封装一个矩阵类去跑 \(\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;
}