题目大意
有
n
个数
求这
n
个集合的并集大小。
时限 3s。
题解
极好的数论题。
第
i
个集合实际上是
由扩展欧拉定理,指数是模
p−1
意义下的。设
B=gcd(b1,b2,...,bm,p−1)
,则
∑任意b
等价于
kB (k∈Z)
。(你可以用 polya 那套理论来理解这个道理,当只有一个
b
的时候可证它是 gcd,当有多个
由于
B
是定值,
同理,设
A′i=gcd(Ai,p−1)
,则第
i
个集合相当于
现在就相当于有一堆
A′i
,它们都是
p−1
的约数。求模
p−1
意义下有多少数是某个
A′i
的倍数。
这就可以容斥 dp 了。把
A′i
去重并从大到小排序,然后一个个计算贡献。这里用
O(n2)
的算法就可以了。
求
A′i
有很多种方法。传统方法是先求出原根
g
,然后求
代码
//直接上cf找,都很短很好理解,比如 tourist_2 的代码