题目描述
你有
n
个数
对于任意一个
ai
,你可以任意选择任意多个
abii
乘起来对
p
取模,得到若干个数。
问所有这样子得到的数的并集大小。
分析
首先
那么根据裴蜀定理, ∀x∈[0,p−1),(b0,b1,⋯,bm,p−1)|x 都可以被取到。
考虑到如此多个 ai 取并集不好做,那么求出离散对数以后,这个底数都会变成原根。问题就放到指数上了。
也就是说,我们记
(ind(ai),b1,⋯,bm,p−1)=ci
考虑怎么计算这个
ci
。根据最大公约数的性质,这个东西等价于
(ind(ai),(b1,⋯,bm,p−1))
ind(x)
可以用离散对数算出来,但是考虑到这里我们需要求它和别的东西的最大公约数,我们没必要真的算出离散对数。
考虑
x
的阶
考虑费马小定理
下证 (ind(x),φ(p))=(φ(p)ord(x),φ(p))=φ(p)ord(x)
左式可以如下变换。
由于 (k,ord(x))=1 ,故左式等于右式。
有了这个以后,我们就可以在这个问题里将阶来取代离散对数起到相同的作用。
之后的问题就是给定
n
个
形式化地说,我们需要统计有多少个
x
,满足
又因为 ci|n ,故 ci|(n,x)
那么我们就可以枚举最大公约数,剩下的式子就是
时间复杂度
O(mlogbi+σ0(p)nlogp+nlnn)
空间复杂度
O(n)