【CF360D】Levko and Sets 题解

题目大意

  有 nn 个数 a1...ana_1...a_nmm 个数 b1...bmb_1...b_m 和一个质数 pp
  第 ii 个集合是这样生成的:一开始只有一个 11。每次找集合内的一个元素 cc 和一个下标 j (j[1,m])j~(j \in [1,m]),若 c×aibjmodpc×a_i^{b_j} \bmod p 不在集合里,则加进去。
  求这 nn 个集合的并集大小。
  n104, m105, ai<p109, bi<109n\le10^4,\ m\le10^5,\ a_i<p\le10^9,\ b_i<10^9
  时限 3s。

题解

  极好的数论题。

  第 ii 个集合实际上是 ai任意ba_i^{\sum 任意b}。(任意b任意b 是指 kjbj, kjZ\sum k_jb_j,~k_j \in \mathbb Z
  由扩展欧拉定理,指数是模 p1p-1 意义下的。设 B=gcd(b1,b2,...,bm,p1)B=gcd(b_1,b_2,...,b_m,p-1),则 任意b\sum 任意b 等价于 kBkB (kZk \in \mathbb Z)。(你可以用 polya 那套理论来理解这个道理,当只有一个 bb 的时候可证它是 gcd,当有多个 bb 的时候,合并两个 bb 可以看作是其中一个模另一个,因此也是 gcd。)

  底数不同于是用原根来表示,设 ai=gAia_i=g^{A_i},则第 ii 个集合表示为 gAikBg^{A_i kB}
  由于 BB 是定值,AiA_i 可以直接视为 Ai×BA_i×B,也相当于一开始把 aia_i 视为 aiBa_i^B。那么现在第 ii 个集合就相当于 gkAig^{kA_i}
  同理,设 Ai=gcd(Ai,p1)A'_i=\gcd(A_i,p-1),则第 ii 个集合相当于 gkAig^{kA'_i}

  现在就相当于有一堆 AiA'_i,它们都是 p1p-1 的约数。求模 p1p-1 意义下有多少数是某个 AiA'_i 的倍数。
  这就可以容斥 dp 了。把 AiA'_i 去重并从大到小排序,然后一个个计算贡献。这里用 O(n2)O(n^2) 的算法就可以了。

  求 AiA'_i 有很多种方法。传统方法是先求出原根 gg,然后求 AiA_i,再求 AiA'_i。当然也有很方便的方法:第 ii 个集合的大小也是 p1p-1 的约数,设为 di=p1Aid_i=\frac{p-1}{A'_i}。由于 AiA'_i 是最大公约数,所以要最小化 did_i,即找到最小的 did_i 使得 aidi1a_i^{d_i}≡1(这里的 aia_i 是指 aiBa_i^B)。