数论反演
Prepare
-
\([P]\) 表示当 \(P\) 为真时 \([P]\) 为 1,否则为 0。
-
\(a|b\) 指 \(b\) 被 \(a\) 整除。
-
一些常见的奇怪函数:
\(I(n)=1\)
\(id(n)=n\)
\(d(n)=n\) 的约数个数
\(\sigma_i(n)=\sum_{d|n}d^i\),其中 \(\sigma_0=\tau=d(n),\sigma_1=\sigma\)
\(\epsilon (n)=[n==1]\)
狄利克雷卷积
- 数论函数
数论函数 \(f: N\rightarrow C\) 指一类定义域是自然数,值域是一个复数集的函数。
我们将这样的数论函数集合记作 \(A\)。
加法:逐项相加就可以辣 \((f+g)(x)=f(x)+g(x)\)
数乘:用一个常数乘 \((xf)(n)=x\cdot f(n)\)
- 狄利克雷卷积
定义两个数论函数的狄利克雷卷积 ∗:
定义卷积 \(t=f∗g\) 为:
也可以写成
狄利克雷卷积有以下性质(两个数论函数相等,是指两个函数的每一项都相等):
- 交换律:\(f∗g=g∗f\)
- 结合律:\(f∗(g∗h)=(f∗g)∗h\)
- 分配律:\(f\ast (g+h)=f\ast g+f\ast h\)
-
没有名字:\((xf)\ast g=x(f\ast g)\)
-
单位元:\(\epsilon \ast f=f\),其中 \(\epsilon(n)=[n==1]\)
- 逆元:对于 \(f\in A\),存在 \(f^{-1}\in A\),使得 \(f\ast f^{-1}=\epsilon\) 当且仅当 \(f(1)\neq 0\)
证明:
(1)\(\Rightarrow\)
令 \(f\in A\),假设存在 \(f^{-1}\in A\),使得 \(f\ast f^{-1}=\epsilon\)。
从而, \(f(1)f^{-1}(1)=(f\ast f^{-1})(1)=\epsilon(1)=1\),得 \(f^{-1}(1)={1\over f(1)}\),所以 \(f(1)\neq 0\)。
(2)\(\Leftarrow\) 使用数学归纳法
Base Case:
令 \(n=1,g(1)={1\over f(1)}\),由于 \(f(1)\neq 0\),我们有
Inductive Step:
假设 \(k\lt n\) 时,\(g(k)\) 都可以唯一定义,我们可以定义 \(g(n)\) 如下:
- \(\mu \ast I=\epsilon\)
证明:
(1). 当 \(n=1\) 时,\(\epsilon(1)=\mu(1)\cdot I(1)=1\) 成立。
(2). 当 \(n\gt 1\) 时,
当 \(\beta_i=0\) 或 \(1\) 时,\(\mu(d)\neq 0\),因此有:
得证 \(\epsilon(n)=0,(n\gt 1)\)。
莫比乌斯变换与反演
莫比乌斯变换
若 \(F=f\ast I\),则称 \(F\) 为 \(f\) 的莫比乌斯变换,即
- \(d=I\ast I\)
证明:
- \(\sigma=I\ast id\)
证明:
莫比乌斯反演(反变换)
\(F=f\ast I\Leftrightarrow f=F\ast \mu\)
证明:
\(F\ast I=(f\ast I)\ast \mu=f\ast (I\ast \mu)=f\ast \epsilon=f\)
- \(\phi * I = id\)
证明:
\(\sum_{d|n}\phi(d)\) 即为求对集合 \(\{1,2,\dots,n\}\) 在 \(\equiv mod(n)\) 关系下的商集的各子集元素个数之和,恰为 \(n\) 本身。
- \(\mu * id = \phi\)
证明:由 \(\phi\ast I=id\),得
左边 \(= (\phi\ast I)\ast \mu=\phi\ast(I\ast\mu)=\phi\ast \epsilon=\phi \)
右边 \(=id\ast \mu=\mu\ast id\)
得证。
积性函数
如果一个数论函数 \(f\) 有当 \(gcd(n,m)=1\) 时,
就称 \(f\) 为积性函数。
一些常见的积性函数:
事实上他们也满足完全积性(即当 \(gcd(n,m)\neq 1\) 时,也有 \(f(nm)=f(n)f(m)\))
特殊的,我们令 \(id0(n)=I(n)=1\)
还有两个普通的积性函数
\(d(n)=n\) 的约数和
\(\varphi(n)=[1,n]\) 中与 \(n\) 互质的数的个数
还有两个重要结论:
两个积性函数的狄利克雷卷积是积性函数。
积性函数的逆是积性函数。
积性函数有什么用呢?
它可以线性筛
然而还有更有用的−−−
莫比乌斯反演
- 一些理论
我们定义 1 的逆是 \(\mu\)
这样的话,如果 \(g=f∗I\),就有 \(f=f*\epsilon=f∗I∗\mu =g∗\mu\)
换句话说,就是
也可以写成
- 例1:求
解:
则
又
带回 \(f(1)\),得
这个用整除分块可以做到 \(\sqrt{n}\)。
- 例2:求
解:
设
则
套用例1的结果
化到现在是 \(O(n)\) 的,因为前后都可以数论分块
但是我们能做得更好
令 \(T=id\)
原式化为
乍一看还是O(n)的呀,但是对于后面那一部分
两个积性函数相乘,可以线性筛呀!!
所以复杂度被我们压到了\(O(\sqrt{n})\)
线性筛
int prime[MAX_N], mu[MAX_N]
bool nprime[MAX_N];
void sieve() {
mu[1] = 1;
for (int i = 2; i <= N; i++) {
if (!nprime[i]) prime[++tot] = i, mu[i] = Mod - 1;
for (int j = 1; i * prime[j] <= N; j++) {
nprime[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
mu[i * prime[j]] = Mod - mu[i];
}
}
}
其实就是和筛素数的是一样的,if (i % prime[j] == 0) break;
这句话保证了复杂度,因为你存的素数是递增的,
如果 i 被 prime[j] 整除后,i∗prime[j+k](k>0) 一定可以被 prime[j]∗x 的形式表示出来。
那么就有我们下面的一个问题:
- 例3:给定你一个数组 \(f\),求:
其中 \(n,m\le 10^7\),数据组数 \(T\le 10^4\)。
由我们上面推的东西,将f看作一个数论函数,可以知道只要求出一个函数 \(g=\mu∗f\) 的前缀和,
这个问题就解决了。
一下是解决这个问题的几种方法(蒯的):
void get_g_1(int N, const int *f, int *g) {
for (int i = 1; i <= N; i++) g[i] = 0;
for (int i = 1; i <= N; i++)
for (int j = 1; i * j <= N; j++)
g[i * j] = (g[i * j] + mu[i] * f[j]) % mod;
} // 依照定义,O(nlogn)
void get_g_2(int N, const int *f, int *g) {
for (int i = 1; i <= N; i++) g[i] = f[i];
for (int i = 1; i <= N; i++)
for (int j = 2; i * j <= N; j++)
g[i * j] = (g[i * j] - g[i]) % mod;
} // 类似求狄利克雷卷积逆的方式,不需要线性筛 mu ,O(nlogn)
void get_g_3(int N, const int *f, int *g) {
for (int i = 1; i <= N; i++) g[i] = f[i];
for (int i = 0; i < prime_count; i++)
for (int j = N / prime[i]; j >= 1; j--)
g[j * prime[i]] = (g[j * prime[i]] - g[j]) % mod;
} // Magic! O(nloglogn)
对于最后一种方法,理解成 \(dp\):
那么转移:
复杂度 \(O(nloglog\ n)\)

浙公网安备 33010602011771号