P2303 [SDOI2012] Longge 的问题
idea:
推式子。
解决方案:
直接开推:
i=1∑ngcd(i,n)=d∣n∑dd∣i∑n[gcd(i,n)=d]=d∣n∑di=1∑dn[gcd(i,dn)=1]=d∣n∑d⋅φ(dn)
这个式子已经可以用了:我们求出 n 的所有质因子,然后 Dfs 枚举 n 的因子即可。时间复杂度 O(n+k) 。 k 为 n 的因子数。由于 O(k)=O(n) ,时间复杂度是 O(n) 的。
然而我们可以再进一步优化(参考题解)
d∣n∑d⋅φ(dn)=d∣n∑dn⋅φ(d)=d∣n∑dn⋅dp∣d,p∈P∏pp−1=n⋅d∣n∑p∣d,p∈P∏pp−1
将 n ,d 分解:
n=i=1∏kpiai
d=i=1∏kpibi(bi∈[0,ai])
那么 d 的答案是:
resd=i=1∏kpipi−1[bi=0]
那么可以发现,与 d 答案相同的其他数只需要包含相同的质因数即可,和个数无关。不妨设 d 有 g 个不同的质因子,第 i 个质因子为 qi 。对于和 d 一类的数答案的和为:
ansd=(i=1∏gqiqi−1)(i=1∏gapos(i))=i=1∏gqiqi−1⋅apos(i)
对于 n 的每个质因子,都可以有选和不选两种原则。故答案为:
∑(p1p1−1⋅a1)0/1⋅(p2p2−1⋅a2)0/1...(pkpk−1⋅ak)0/1
只能意会。。。相当于 Σ 里面有 2n 项。然后我们可以因式分解,答案为:
i=1∏k(pipi−1⋅ai+1)
其实很好理解,每个质因子都可以选和不选,选的话是前面一坨,不选是 1 ,乘开来刚好是 2n 项。
用这个式子可以做到时间上 O(n) 的复杂度,空间上 O(1) 。