莫比乌斯反演
莫比乌斯函数定义
\[\mu(n)=
\begin{cases}
1 &n=1\\
0 &n 含有平方因子\\
(-1)^k & k\space为\space n\space 的本质不同质因子个数
\end{cases}
\]
性质
- 莫比乌斯函数不仅是积性函数,还有如下性质:
\[\sum_{d|n}\mu(d)=
\begin{cases}
1 &n=1\\
0 &n\ne 1
\end{cases}
\]
即 $\sum_{d|n}\mu (d)=\varepsilon(n),\mu *1=\varepsilon $
补充结论
反演结论:\([\gcd(i,j)= 1]=\sum_{d|gcd(i,j)}\mu(d)\)
利用 \(\varepsilon\) 函数 :\([\gcd(i,j)=1]=\varepsilon (gcd(i,j))\)
线性筛
- 由于 \(\mu\) 是积性函数,因此可以线性筛莫比乌斯函数(线性筛基本可以求所有的积性函数,尽管方法可能不同)
// C++ Version
void getMu() {
mu[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!flg[i]) p[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
flg[i * p[j]] = 1;
if (i % p[j] == 0) {
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = -mu[i];
}
}
}
扩展
证明:
\[\varphi * 1=\operatorname{id}
\]
对于欧拉函数有一个性质,\(\operatorname{id(n)}=\sum_{d|n}\varphi(d)\)
那么以狄利克雷卷积的形式写出来,\(\varphi * 1=\operatorname{id}\)
两边同时卷上 \(\mu\) ,那么 \(\varphi * \varepsilon=\operatorname{id}*\mu\) ,那么 \(\varphi (n)=\sum_{d|n} d \cdot \mu(\frac{n}{d})\)
莫比乌斯变换
设 \(f(n) ,g(n)\) 为两个数论函数
形式一:
-
如果有 \(f(n)=\sum_{d|n} g(d)\) ,那么有 \(g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d})\)
-
这种形式下,数论函数 \(f(n)\) 称为数论函数 \(g(n)\) 的莫比乌斯变换,数论函数 \(g(n)\) 称为数论函数 \(f(n)\) 的逆莫比乌斯变换(反演)
-
数论函数的 \(g(n)\) 的莫比乌斯变换就是 \(g(n)*1\)
形式二:
- 如果有 \(f(n)=\sum_{n|d}g(d)\),那么 \(g(n)=\sum_{n|d}\mu(\frac{d}{n})f(d)\)
证明:
- 对于 \(g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d})\) ,带入 \(f(n)=\sum_{d|n}g(d)\) ,然后变换求和顺序,最后通过 \(\mu\) 来变换
问题形式
- 首先可以将这个拆成四个前缀,那么我们要求的就是
\[\begin{aligned}
\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=k]&=\sum_{i=1}^{n/k}\sum_{j=1}^{m/k}[\gcd(i,j)=1]\\
&=\sum_{i=1}^{n/k}\sum_{j=1}^{m/k}\sum_{d|\gcd(i,j)}\mu(d)\\
&=\sum_d\mu(d)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor
\end{aligned}
\]
- 最后的实际上是有关 \(\lfloor\frac{n}{d}\rfloor\) ,那么就可以整除分块了
- 首先肯定可以变成这样 \(n\sum_{i=1}^n\frac{i}{\gcd(i,n)}\)
- 还是考虑枚举 \(\gcd\) ,那么最后会变成 \(n\sum_{d|n}\sum_{i=1}^{n/d}i[\gcd(i,n/d)=1]\)
- 注意到这里的含义是 \([1,n/d]\) 中和 \([n/d]\) 互质的数的和,而 \(n/d\) 也是 \(n\) 的一个因子,那么就等价于
- \(n\sum_{d|n}\sum_{i=1}^di[\gcd(i,d)]=1\)
- 仍然是注意到上面的含义,有关 \([1,d]\) 中和 \(d\) 互质的数的和,互质的数是一对对的,如果 \(x\) 和 \(d\) 互质,那么 \(d-x\) 一定和 \(d\) 互质,所以这个和就是 \(\frac{d\varphi(d)}{2}\)
- 那么答案就是 \(n\sum_{d|n}\frac{d\varphi(d)}{2}\)
- 第一种方法是 \(O(n\ln n)\) 预处理出所有范围内的值,因为 \(O(n\times(\frac{1}{1}+\frac{1}{2}+....))-O(n\ln n)\)
- 第二种方法是线性筛出来所有的 \(f(n)=n\sum_{d|n}\frac{d\varphi(d)}{2}\),注意到这个函数是个积性函数,而大部分的积性函数是可以做到线性筛的
- 下面进行推导
- 假设 \(n=p_1^{c_1}p_2^{c_2}...\) ,那么 \(f(p^c)=\sum_{w=0}^cp^w\varphi(p^w)=(p-1)\sum_{w=0}^c p^{2w-1}\)
- 那么 \(g(p^{c+1})=g(p^c)+p^{2c+1}\times (p-1)\)
- 设 \(i=a\times p^c,c>0,a\perp p\) ,那么 \(g(i\times p)=g(a)\times g(p^{c+1}),g(i)=g(a)\times g(p^c)\)
- \(g(i\times p)-g(i)=g(a)\times p^{2c+1}\times (p-1)\)
- 同理有 \(g(i)-g(i/p)=g(a)\times p^{2c-1}\times (p-1)\)
- 那么 \(g(i\times p)=g(i)+(g(i)-g(i/p))\times p^2\)
参考:
void solve() {
g[1] = 1;
for (int i = 2; i <= N; ++i) {
if (!flg[i]) {
p[++tot] = i;
g[i] = (long long)1 * i * (i - 1) + 1;
}
for (int j = 1; j <= tot && i * p[j] <= N; ++j) {
flg[i * p[j]] = 1;
if (i % p[j] == 0) {
g[i * p[j]] =
g[i] + (g[i] - g[i / p[j]]) * p[j] * p[j]; // 代入推出来的式子
break;
}
g[i * p[j]] = g[i] * g[p[j]];
}
}
}
- 如果已经确实是积性函数了,那么就考虑最小质因数的个数 >=2 的情况就可以了
- 大概的步骤:
- 首先求出质数的幂的答案
- 然后设 \(i=a\times p^c,c>0,a\perp p\)
- 那么 \(g(i)=g(a)\times g(p^{c})\)
- 那么 \(g(i\times p)=g(a)\times g(p^{c+1})\)
- 然后算出 \(g(i\times p)-g(i)\)
- 算出 \(g(i)-g(i/p)\)
- 两个式子相互推一下,就可以得到 \(g(i\times p)\) 的表示式
- 欧拉函数有一个性质 \(\varphi(p^k)=p^k-p^{k-1}\) ,质数的表示式是可以变换的,所以这里先求出质数的答案
P1829 [国家集训队]Crash的数字表格 / JZPTAB
- 首先变成 \(\sum_{d=1}^{min(n,m)}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}ij[\gcd(i,j)=1]\)
- 将后面的部分提取出来,\(\sum_{i=1}^{n}\sum_{j=1}^m ij[\gcd(i,j)=1]\)
- 这个东西还是考虑变换,也就是变成 \(\sum_d \mu(d)d\sum_{i=1}^{n/d}\sum_{j=1}^{n/d} ij\)
- 仍然将后面的部分提出来,\(\sum_{i=1}^n\sum_{j=1}^{m} ij\) ,就是 \((\sum_{i=1}^ni)(\sum_{j=1}^m j)\)
- 那么再放回去,就会发现就是数论分块套数论分块,那么整体的复杂度 \(O(n)\)
- 我一开始还以为要 \(O(n)\) 线性筛函数,然后就越来越跑偏
- 首先要知道 \(d(xy)=\sum_{i|x}\sum_{j|y}[\gcd(i,j)=1]\)
- 先推出这样个式子:\(\sum_d\mu(d)\sum_{k_1=1}^{n/d}\sum_{k_2=1}^{m/d}\lfloor\frac{n}{k_1d}\rfloor\lfloor\frac{m}{k_2d}\rfloor\)
- 将后面的提出来,就是 \(\sum_{i=1}^n\sum_{j=1}^m\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{j}\rfloor\)
- 那么 \(O(n\sqrt n)\) 预处理出 \(f(n)=\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\)
- 那么原式子就可以在 \(O(T\sqrt n)\) 做完