题面
给定 \(N\) 个正整数 \(A_1,A_2,\cdots,A_n\) 和一个素数 \(P\)。求满足以下条件的二元组 \((i,j)\) 的个数。
-
\(1\leq i,j\leq N\)。
-
存在正整数 \(k\),使得 \(A_i^k\equiv A_j\pmod P\)。
数据范围:$ 2\ \leq\ N\ \leq\ 2\ \times\ 10^5 , P\ \leq\ 10^{13}$。
题解
发现 \(A_i^k\equiv A_j\pmod P\) ,可以想到求出 \(P\) 的原根 \(p\),那么就可以把 \(A_i^k\equiv A_j\bmod P\to kb_i=b_j\bmod P-1\)
但是你需要对每一个 \(A_i\) 求出 \(b_i\) 使 \(p^{b_i}\equiv A_i\mod P\),也就是做 \(N\) 次 BSGS,时间复杂度是不对的。
这时就有另一种转化方法,求 \(A_i\) 的阶 \(b_i\)。
阶:满足 \(a^n\equiv 1\pmod m\) 的最小正整数 \(n\) 就是 \(a\) 在模 \(m\) 下的阶。
这样 \(A_i^k\equiv A_j\to A_{i}^{kb_i}\equiv A_j^{b_i}\to 1\equiv A_j^{b_i}\),此时若 \(b_i|b_j\) 那么就是满足的。
如何求阶?
一个性质,就是 \(x\) 在 \(P\) 意义下的阶一定是 \(\varphi(P)\) 的因数,那么我就可以枚举 \(P-1\) 的所有质因数 \(p_i\),然后看\(x\) 的 \(\frac{now}{p_i}\) 次方是否还是 \(1\),如果是则 \(now\leftarrow \frac{now}{p_iu}\) 。
求出所有 \(b_i\) 后,因为 \(P\) 的因数个数最大是 \(10^4\) ,那么可以 \(O((10^4)^2)\) 的复杂度去一一判断,然后就解决了。
启发
- 阶的一个高级运用。