本文使用 MathJax 渲染公式。如果过了好久以下这行还是不能正常显示那个优美而著名的公式的话,尝试进浏览器调试控制台 Network 栏看看咋回事吧
∑d|nμ(d)=[n=1]一堆 O(n) — O(√n) 数论题。
号称是莫比乌斯反演,同学都说是容斥是什么情况啊
当然有些性质
μ(1)=1 μ(p)=−1(p∈P)那个是“p是质数”的意思
μ(uv)=μ(u)μ(v)(gcd(u,v)=1)然后就可以线性筛了对吧
好了,知道能算就行了
下面是最重要的那个式子啦
∑d|nμ(d)=[n=1][P] 表示 P 这个 bool
当 int
使的值
如果你知道 F(1),和如何比较方便地在 p/| u 时算出 F(pαu),那么就可以线性筛啦!
方法是,对每个数 pαu 维护这个数的最小质因子 p 是什么(线性筛 ftw),和这个质因子出现了多少次 α(发现(质数 z) z|m 就 count[zm]=count[m]+1 就好了),还有除下这么多质数剩下的数 u。显然还是线性的,而且我们也确实维护出了需要的信息。
(没有上界。因为除着除着就没了)
对于任意一个 i,从 i 一直到 ⌊n⌊n/i⌋⌋,⌊ni⌋ 都是一样的。所以我们可以这么着分块算
for (i = 1; i <= n; i = last + 1)
last = n / (n / i)
ans += ...
可以得出 ⌊ni⌋ 和 ⌊mi⌋ 总共有 O(√n) 个取值(这里假定 n 和 m 同阶)
为什么?因为 1 n 被下取整除法分成 O(√n) 段,1 m 也是。总共被砍了 O(√n) 刀,还是 O(√n) 块。
对于一个 i,既然 ⌊ni⌋ 一样的最后一个是 ⌊n⌊n/i⌋⌋,那俩都一样的肯定到 min(⌊n⌊n/i⌋⌋,⌊m⌊n/i⌋⌋) 呗
枚举的时候要注意啦,for
那里的 i <= n
得 n≤m 才正常。swap
一下就修好了。
if (n > m) swap (n, m)
for (i = 1; i <= n; i = last + 1)
last = min (n / (n / i), m / (m / i));
ans += ...
我们看到了可爱的 [???=1]
n∑i=1m∑j=1∑d|gcd(i,j)μ(d)d|gcd(i,j) 就是两个都整除嘛。
n∑i=1m∑j=1∑d|i∧d|jμ(d)我们考虑枚举 d
∑dμ(d)n∑i=1m∑j=1 [d|i∧d|j]只有 d 的倍数的 i 和 j 有贡献。我们偷换变量
条件永远为真
∑dμ(d)n∑di=1m∑dj=1 11 到 n 有哪些 d 的倍数。嗯这挺好办的。
∑dμ(d)⌊n/d⌋∑i=1⌊m/d⌋∑j=1 1数数好办
∑dμ(d)⌊nd⌋⌊md⌋预处理 μ 前缀和可 O(n) 预处理 O(√n) 查询。
显然 i 和 j 都得是 k 的倍数
n∑ki=1m∑kj=1 [gcd(ki,kj)=k] n∑ki=1m∑kj=1 [gcd(i,j)=1]1 到 n 里 k 的倍数好啊
⌊nk⌋∑i=1⌊mk⌋∑j=1 [gcd(i,j)=1]然后就变成上一道题了。结论是
∑dμ(d)⌊nkd⌋⌊mkd⌋考虑枚举 gcd 是啥,数有多少个,乘 gcd 再加起来就是求和啊
∑ggn∑i=1m∑j=1 [gcd(i,j)=g]代上一题结论
∑gg∑dμ(d)⌊ngd⌋⌊mgd⌋我们枚举 gd 好不好啊
∑gd(∑d,gg μ(d))⌊ngd⌋⌊mgd⌋这里的枚举 d,g 就是枚举相乘等于 dg 的数啦
预处理里面那个小求和 F(dg) 的前缀和可 O(n) 预处理 O(√n) 查询。
注:可以证明 F(n)=φ(n),其中 φ 是欧拉函数
可以推出来一个类似上一题的结论
∑pd(∑p∈P,dμ(d))⌊npd⌋⌊mpd⌋(本题中不再赘述 p 是质数)
我们来考虑一下 F(n)=∑p|nμ(n/p) 的性质。
对于 z∈P,z/| u
F(zu)=∑p|zuμ(zu/p)=μ(u)+∑p|uμ(zu/p)=μ(u)+∑p|u−μ(u/p)=μ(u)−∑p|uμ(u/p)=μ(u)−F(u)但是如果 z|u,那么只要 p≠z,zu/p 就有平方因子 z2,所以就挂掉了
F(zu)=∑p|zuμ(zu/p)=μ(u)+∑p|uμ(zu/p)=μ(u)预处理 F(pd) 的前缀和可 O(n) 预处理 O(√n) 查询。
往下推呗
∑ni=1∑mj=1lcm(i,j)=∑d∑ni=1∑mj=1ijd[gcd(i,j)=d]=∑d∑ndi=1∑mdj=1d2ijd[gcd(di,dj)=d]=∑d∑⌊n/d⌋i=1∑⌊m/d⌋j=1d2ijd[gcd(i,j)=1]=∑dd∑⌊n/d⌋i=1∑⌊m/d⌋j=1ij [gcd(i,j)=1]然后我们像上面那样枚举 gcd(i,j)=u,i 偷换成 ui,j 偷换成 uj。
=∑uμ(u)∑d∑⌊n/du⌋i=1∑⌊m/du⌋j=1u2dij=∑uμ(u)∑du2(∑⌊n/du⌋i=1i)(∑⌊m/du⌋j=1j)=∑du(∑d,udu2μ(u))⌊n/du⌋(1+⌊n/du⌋)2⌊m/du⌋(1+⌊m/du⌋)2=∑dudu (∑d,uu μ(u))⌊n/du⌋(1+⌊n/du⌋)2⌊m/du⌋(1+⌊m/du⌋)2预处理 du (∑d,uu μ(u)) 前缀和可 O(n) 预处理 O(√n) 查询。