Oi-Wiki上说学习莫比乌斯反演须要Dirichlet 卷积,其实不学它也没有什么问题。函数
能够用到整除分块的形式,大体是这样的:学习
这个 \(O(n)\) 很是好写,可是题目提升了要求,必须 \(O(\sqrt n)\) 把它求出来。
很是显然的,许多数向下取整是相同的,而且是呈块状分布的,咱们能够借助这个性质来求它。
咱们发现对于每个值相同的块,它的最后一个数就是 \(n/(n/i)\) 。得出这个结论后,咱们就能够作的 \(O(\sqrt n)\)处理了。
证实:考虑把 \(n/(n/i) + 1\) 后再乘 \(n/i\),不难发现已经大于 n 了,得证。ui
for(register int l = 1, r; l <= n; l = r+1) { r = n / (n/l); ans += (r-l+1) * (n/l); }
莫比乌斯函数实际上是一个很是简单的函数。
设正整数 \(N\) 质因数分解后为 \(N = p_1^{c_1} * p_2^{c_2} * ... * p_m^{c_m}\),定义函数:spa
这就是莫比乌斯函数。
应该比较好理解。
莫比乌斯函数也有一些性质:code
再就是线性筛莫比乌斯函数:class
bool vis[N]; int mu[N], prime[N], tot; void shai(int n) { mu[1] = 1; for(register int i = 2; i <= n; ++i) { if(!vis[i]) { mu[i] = -1; prime[++tot] = i;} for(register int j = 1; j <= tot && prime[j] * i <= n; ++j) { vis[prime[j] * i] = 1; if(i % prime[j] == 0) break; else mu[i * prime[j]] = -mu[i]; } } }
感受很好理解。学习笔记
终于到了莫比乌斯反演了,其实学了折磨多前置知识后,莫比乌斯反演就是个式子。
设 \(F(n)\) 和 \(f(n)\) 是定义在非负整数上的函数,且知足:im
那么就有 :统计
这就是莫比乌斯反演定理。总结
莫比乌斯反演的证实主要有两种方式,其中一种就是经过定义来证实 ; 另一种就是利用狄利克雷卷积证实,咱们只说第一种:
由此得证。
若是不知道最后一步怎么来的,能够再去看性质一,至于和式的变换,就本身脑补一下吧。
莫比乌斯反演的另外一种形式:
当 \(F(n)\) 和 \(f(n)\) 知足 :
那么能够得:
感受这个式子,可能在莫比乌斯反演中更加好用。
莫比乌斯反演是一个学会了也不会作题的知识,因此只有多推式子,才能用熟它,多作题吧。