设 (m = p_0^{k_0})。如果 (p_0 mid p) 那么 (p^e=km+x) 的条件只有在 (e=0) 的时候对 (1) 会产生约束,其余的约束都被包含在了 (p_0) 那里,问题是平凡的。
对于 (p_0 mid p),(T = {p^e mod m|e in N})(集合里的数均对 (m) 取模,下同)中不会存在 (p_0) 的倍数,故两个条件约束的数集无交。判断无解需要知道集合 (T) 的大小才行,故考虑计算 (|T| = mathrm{order}(p))。由于 (p^{varphi(m)}=1,) 故 (mathrm{order}(p) mid varphi(m))。将 (varphi(m)) 用 Pollard-Rho 分解质因数后枚举约数进行检验即可计算出 (mathrm{order}(p))。
如果 (mathrm{order}(p) + frac{m}{p_0}+n geq m) 则显然无解,否则考虑找一组解。
如果存在 (mod m) 意义下的原根,找一个原根 (g),设 (p equiv g^u mod m)。那么 (T = {g^0,g^u,g^{2u},ldots,g^{(mathrm{order}(p)-1)u}}),设 (v = gcd(u,varphi(m)) = frac{varphi(m)}{mathrm{order}(p)})。不难证明 (T = {g^0,g^v,g^{2v},ldots,g^{(mathrm{order}(p)-1)v}})。于是不合法的数在原根幂表示下指数一定是 (v) 的倍数。因为 (mathrm{order}(p) leq frac{m}{2}) 所以 (v geq 2),求出 (v) 后暴力枚举较小的指数选择。
对于不存在原根的情况,(p_0=2)。可以这样做:
- 对于 (m leq 10^7) 暴力;
- 对于 (p = 4x+1),注意到 (forall e in N, p^e equiv 1 mod 4),所以可以在模 (4) 余 (3) 的数中选,因为 (m > 10^7,n leq 5 imes 10^5) 所以总能选出来;
- 对于 (p = 4x+3),只在模 (4) 余 (1) 的数中选,那么可以把 (p) 换成 (p^2)。注意到在模 (2^k(k geq 3)) 意义下取 (g'=5) 时,任意一个模 (4) 余 (1) 的数都可以表示为 (g') 的若干次幂,证明可以考虑计算 (mathrm{order}(g')),这里不多赘述。利用 (g') 就可以类似有原根的做法做。因为 (mathrm{order}(p^2) = frac{mathrm{order}(p)}{2}),而 (mathrm{order}(p) + frac{m}{p_0}+n geq m) 时 (2mathrm{order}(p) leq varphi(m)),所以也总能选出一组解。
忽略 long long 乘法实现总复杂度 (O(m^frac{1}{4} + d(varphi(m)) + n))