这是我第一次写的代码:
struct Node {
lint x; int flag;
};
Node qpow(lint a, lint x, int p) {
int fa = a >= p, fr = 0;
lint r = 1; a %= p;
while (x) {
if (x & 1) {
r = r * a, fr |= fa;
if (r >= p) fr = 1;
r %= p;
} a = a * a, fr |= a >= p ? 1 : 0, a %= p;
x >>= 1;
} return {r, fr};
}
这是 WA 了的,而如果我把最后一行改成:
return {r, fr | fa};
那么就可以 AC,我不是很理解,例如 qpow(3, 1, 5) 是不会溢出的,但是在 return {r, fr | fa} 的代码中判断出是会超过 p 的……这是合理的吗?