0%

ABC335G - Discrete Logarithm Problems

题目链接

https://atcoder.jp/contests/abc335/tasks/abc335_g

题目大意

给定 n 个正整数 a1,a2,,an 和一个素数 P。求满足以下条件的二元组 (i,j) 的个数。

  • 1i,jN

  • 存在正整数 k ,使得 AikAj(modP)

数据范围

  • 1n2×105
  • 1ai<P
  • 2<P1013P 是素数

解题思路

考虑同余式 xky(modP) 能推出什么结论。

δP(x) 表示 x 在模 P 意义下的阶,因为 xky 在模 P 意义下同余,所以一定有 δP(xk)=δP(y)

其实以上的转化是我看题解看到的,至于应该怎么想才能自然地想到这一步,感觉需要一定的数学直觉,并且需要靠多做题积累经验。

根据阶的性质,有 δP(xk)=δP(x)gcd(k,δP(x)) ,所以可以得到 δP(x)=gcd(k,δP(x))δP(y) ,所以我们能推出一个必要条件

$$ kN,xky(modP)δP(y)δP(x)

$$

那么该条件的充分性是否成立呢。

  • lemma 1

    如果 tatb(modtc) ,则 ab(modc) 成立,其中 t,a,bN+

    证明非常简单,只需要把取模运算的表达式写出来即可证明。

假设 gP 的一个原根,根据原根的性质,一定存在 e1e2 使得 ge1x(modP)ge2y(modP),两边取离散对数有 e1indg(x)(modP1)e2indg(y)(modP1) 。我们要证 kN,xky(modP) ,即证 kN,ke1e2(modP1)

根据条件有

$$ δP(y)δP(x)δP(ge2)δP(ge1)P1gcd(e2,P1)P1gcd(e1,P1)gcd(e1,P1)gcd(e2,P1)

$$

t=gcd(e1,P1) ,根据 lemma 1 和要证的式子 ke1e2(modP1) ,有

$$ ke1te2t(modP1t)

$$

因为 e1tP1t 互质,所以有

$$ ke2t(e1t)1(modP1t)

$$

所以条件的充分性成立,即

$$ kN, xky(modP)δP(y)δP(x)

$$

接下来,考虑如何求一个数 a 在模 P 意义下的阶 δP(a) 。因为 δP(a)(P1) ,并且若 δP(a)b ,那么 xb1(modP) 成立,所以可以先将 P1 质因数分解,初始时令 b=P1 ,每次选取一个质因数 p ,判断 xbp1(modP) 是否成立,成立则将 p 除掉,不成立就取下一个质因数做相同的操作,这样最后得到的 b 就是 a 的阶。对于给定序列的每一个 ai 做一遍上述操作的时间复杂度为 O(P+nlog2P)

根据上表,我们发现 P1 的约数个数的级别不超过 104 ,所以可以直接 O(d(P)2) 计算 δP(ai) 对答案的贡献。

所以总时间复杂度为 O(P+nlog2P+d(P)2) ,时限为 5s ,可以通过本题。

参考代码

https://atcoder.jp/contests/abc335/submissions/49356980