莫比乌斯反演学习笔记

莫比乌斯反演学习笔记

Oi-Wiki上说学习莫比乌斯反演须要Dirichlet 卷积,其实不学它也没有什么问题。函数

前置知识

整除分块

能够用到整除分块的形式,大体是这样的:学习

\[\sum_{i=1}^{n}(n/i) \]

这个 \(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

\[\mu(N) =\begin{cases} 0 (任意c_i>1)\\1(m \equiv 0(mod2))\\-1(m \equiv 1(mod2)) \end{cases} \]

这就是莫比乌斯函数。
应该比较好理解。
莫比乌斯函数也有一些性质:code

  • 对于任意正整数 \(n\),都有 \(\sum_{d | n}^{}\mu(d) = [n == 1]\)
    就是说除了 n 为 1,其余的都是0。
    这个就是用μ是容斥系数的性质能够证实。
    能够考虑用组合数的性质证实。
    这一条性质是莫比乌斯反演中最经常使用的
  • 对于任意正整数 \(n\),都有 $ \sum_{d|n}\mu(d) / d = \varphi(n)/n$
    这个暂时我证实不出来。

再就是线性筛莫比乌斯函数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) = \sum_{d|n}f(d) \]

那么就有 :统计

\[f(n) = \sum_{d|n}\mu(d)F(n/d) \]

这就是莫比乌斯反演定理总结

证实

莫比乌斯反演的证实主要有两种方式,其中一种就是经过定义来证实 ; 另一种就是利用狄利克雷卷积证实,咱们只说第一种:

\[\sum_{d|n}\mu(d)F(n/d) = \sum_{d|n}\mu(d)\sum_{i|(n/d)}f(i) = \sum_{i|n}f(i)\sum_{d|(n/i)}\mu(d) = f(n) \]

由此得证。
若是不知道最后一步怎么来的,能够再去看性质一,至于和式的变换,就本身脑补一下吧

莫比乌斯反演的另外一种形式:
\(F(n)\)\(f(n)\) 知足 :

\[F(n) = \sum_{n|d}f(d) \]

那么能够得:

\[f(n) = \sum_{n|d}\mu(d/n)F(d) \]

感受这个式子,可能在莫比乌斯反演中更加好用。

总结

莫比乌斯反演是一个学会了也不会作题的知识,因此只有多推式子,才能用熟它,多作题吧。

相关文章
相关标签/搜索