数论函数&莫比乌斯反演
jiazhaopeng · · 个人记录
真 莫比乌斯反演
突然发现之前学的(见下面)是假的(是对的,但是很麻烦)。于是又学了学简单一些的方法。
反演的主要依据:
然后直接将式子中的
例:(n<m)(以下未经特殊说明,除法均为下取整)
一些小技巧
-
交换求和号
-
更换枚举变量(有时可以直接砍掉中括号)
-
\sum_{i=1}^n \sum_{j=1}^m a_i * b_j = (\sum_{i=1}^n a_i) * (\sum_{j=1}^m b_j)
数论函数
详见洛谷日报:铃悬的数学小讲堂——狄利克雷卷积与莫比乌斯反演
数论函数的自变量为正整数。
运算率:
-
加法:逐项相加。
-
数乘:每项都与该数相乘。
-
狄利克雷卷积
狄利克雷卷积
若t = f × g, 则 t(n) = sigma(i|n){f[i] * g[n/i]}。
狄利克雷卷积具有:交换律,结合律,分配律。
单位元ε(x) = [x = 1]。单位元和任何数论函数做狄利克雷卷积,都得该数论函数本身。
求逆元:设g为f的逆元,即g * f = ε:
积性函数
仍然引用qy学长的课件:
在数论中的积性函数:
对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。
若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的。
一些积性函数:
特别地,定义:
(上面的前面的1应该加粗)
需要记一些结论:
两个积性函数的狄利克雷卷积是积性函数
积性函数的逆是积性函数
应用:线性筛
同时,我们有一个重要结论:
id = φ×1
莫比乌斯反演
定义莫比乌斯函数
为1的逆元,若 g = f 1,则 f = g μ
如果
则
这就是莫反了。
需要记几个式子,莫比乌斯反演做不出来时可以用它们来搞(其实和莫比乌斯反演差不多)
(1用I来代替)
其中
然后是
我们要证的是:
我们把1~n 变成
求μ
易得,μ是积性的。
因此:
Code:
//线性筛
for (register int i = 2; i <= limi; ++i) {
if (!depri[i]) pri[++tot] = i, mu[i] = -1;
for (register int j = 1; j <= tot && i * pri[j] <= limi; ++j) {
depri[i * pri[j]] = true;
if (i % pri[j] == 0) { mu[i * pri[j]] = 0; break; }
mu[i * pri[j]] = -1 * mu[i];
}
}
//分解质因数
inline ll get_mu(ll num) {
int type = 1;
for (register ll i = 2; i * i <= num; ++i) {
if (num % i == 0) {
int ct = 0;
while (num % i == 0) ct++, num /= i;
if (ct > 1) return 0;
type *= -1;
}
}
if (num > 1) type *= -1;
return type;
}
例题
数学公式好难打
建议看这篇博客:莫比乌斯反演-让我们从基础开始(主要看模型)和这篇博客:题解 P2257 【YY的GCD】(主要看套路)
- P2257 YY的GCD(P2568 GCD开O2也可以这么做)
f(d) 为 gcd(i,j)=d 的(i, j)的对数,F(n) 为gcd(i,j)= n和n的倍数 的对数。
这样,就有
然后进行一系列推导,使得式子里(N/n) * (M/n)可以用分块做,μ的部分可以预处理出前缀和,然后对于这种题就差不多了。
- P3455 [POI2007]ZAP-Queries
这个要相对简单很多。
仍然设f(d) 为 gcd(i,j)=d 的(i, j)的对数,F(n) 为gcd(i,j)= n和n的倍数 的对数。
仍然有
题目要求的正是f[k]。
莫反开始:
令d = tk,即t = (d / k);
令A=a/k,B=b/k。
其中μ可以预处理,A/t,B/t可以除法分块。
附:经打表检测,(除法为下取整)a/(b*c) = (a/b)/c = (a/c)/b
- T118576 心灵治愈(heal)(团队题目)
求:有多少种选择a1,a2,...,an的方案(ai <= m,an+1 = m),存在整数k1,k2,...,kn,kn+1,使得
公式推导: