莫比乌斯反演与狄利克雷卷积
莫比乌斯反演
数论函数
列举几个常见数论函数
- \(\varphi(n)\),欧拉函数,表示\(1\sim n\)中与\(n\)互质的数的个数
- \(d(n)\),表示\(n\)的约数个数,具体设\(n=p_1^{c_1}p_2^{c_2}……p_m^{c_m}(p_1,p_2……都是质数)\),则\(d(n)=\prod_{i=1}^m(c_i+1)\)
- \(\lfloor\rfloor\),下取整函数,\(\left\lfloor\frac{\lfloor\frac{a}{b}\rfloor}{c}\right\rfloor=\lfloor\frac{a}{bc}\rfloor\)
- \(\sigma(n)\),表示\(n\)的约数和,也即\(\sigma(n)=\prod_{i=1}^m\frac{p^{c_i+1}-1}{p_i-1}\)
- \(I(n)\),恒等函数,值恒为1
- \(id(n)\),单位函数,\(id(n)=n\)
- 单位函数\(\epsilon(n)=[n=1]\)
先看几个约数函数的常见性质
\(\sum_{d|n}d\mu(\frac{n}{d})=\varphi(n)\)
\(\sum_{d|n}\varphi(d)=n\)
\(\sum_{d|n}\mu(d)=[n=1]\)
\(d(AB)=\sum_{x|A}\sum_{y|B}[\gcd(x,y)=1]\)
积性函数
定义1:若对于函数\(f\)来说,使得对于满足\(\gcd(x,y)=1\)的任意正整数\(x,y\),满足\(f(xy)=f(x)f(y)\)
则称\(f\)为积性函数.
例如:\(\varphi,d,\mu,id,I,\sigma\)都是积性函数
定义2:若对于函数\(f\),若任意正整数\(x,y\)都有\(f(xy)=f(x)f(y)\),则称\(f\)为完全积性函数
例如:\(I,id,\sigma,d\)是完全积性函数
狄利克雷卷积
定义两个数论函数\(f,g\)的狄利克雷卷积\(t=f*g\),使得:\(t(n)=\sum_{ij=n}f(i)g(j)\)
性质:
- 交换律:\(f*g=g*f\)
- 结合律:\((f*g)*t=f*(g*t)\)
- 分配律:\(t*(f+g)=t*f+t*g\)
- 标量乘法:\((x·f)*g=xf*g\)
- 逆元:对于任意函数\(f(1)\neq 0\),有函数\(f\)的逆\(g\)满足\(f*g=\epsilon\)
讨论一下逆的求法,对于函数\(f\)的逆\(g\),满足
证明:将\(g\)带入原式,设\(t=f*g\),有
在\(n=1\)时显然成立,在\(n\neq1\)时,原式等价于\(-\frac{\sum_{ij=n}f(i)\sum_{k|j,k\neq j}g(k)f(\frac{j}{k})}{f(1)}\),显然此式每一对\(ij\)能抵消,分子为0,故得证
莫反及其应用
莫比乌斯反演是关于莫比乌斯函数的,具体的证明可以由容斥原理导出,也可以看这里
莫比乌斯反演的两种形式
形式1:
形式2:
实际应用:
例1:P2568GCD
给定正整数 \(n\),求 \(1\le x,y\le n\) 且 \(\gcd(x,y)\) 为素数的数对 \((x,y)\) 有多少对。
题意即为求
设\(f(i)=\sum_{i=1}^a\sum_{j=1}^b[gcd(i,j)=i],g(i)=\sum_{i|d}f(d)\),也即\(S=\sum_{质数p\le n}f(p)\)
则\(g(n)=\sum_{n|d}\sum_{i=1}^a\sum_{j=1}^b[gcd(i,j)=d]=\sum_{i=1}^a\sum_{j=1}^b[n|gcd(i,j)]=\sum_{i=1}^{\lfloor\frac{a}{n}\rfloor}\sum_{j=1}^{\lfloor\frac{b}{n}\rfloor}[1|gcd(i,j)]=\lfloor\frac{a}{n}\rfloor\lfloor\frac{b}{n}\rfloor\)
所以由莫比乌斯反演定理得\(f(p)=\sum_{p|d}\mu(\frac{d}{p})g(d)=\sum_{1\le i}\mu(ip)g(i)=\sum_{1\le i}\mu(i)\lfloor\frac{n}{ip}\rfloor^2\)
故\(S=\sum_{质数p\le n}\sum_{1\le i}\mu(i)\lfloor\frac{n}{ip}\rfloor^2\),设\(ip=T\),则
预处理\(\mu\)前缀和,数论分块即可,后面的式子可以在筛质数的时候用埃氏筛求出\(p\)的集合即可
例2:P2398
给定\(n\),求:\(\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\)
原式=
一样设\(T=id\),则原式=
因为\(\sum_{d|n}\varphi(d)=n\),所以将欧拉函数带入莫比乌斯反演公式,可以得到\(\varphi(n)=\sum_{d|n}d\mu(\frac{n}{d})\),仔细观察,也即我们最终结果后面的那坨式子等价于\(\varphi(T)\)
故最终\(S=\sum_{T=1}\lfloor\frac{n}{T}\rfloor^2\varphi(T)\),此时预处理出\(\varphi\)的前缀和,结合数论分块,就可以做到\(O(n+q\sqrt n)\)的复杂度(q为询问次数)
例三:
给出 \(n,m\) 和一个长度为 \(n-1\) 的序列 \(x\),保证 \(x_i\) 互不相同。
答案对 \(998244353\) 取模。
设
则\(g(n)\)展开为:
除过去,变成
假若令\(x_n=-\infty,x_0=x_n\),则式子可以改写为
分子可以预处理比较,设比较后为\(a_i\),\(b_i=\lfloor\frac{m}{a_i}\rfloor\)
因为我们所求为:
上面那个\(min\)看上去很恶心,预处理改成\(d\)
展开变成:
这个式子是一个扩展形式的数论分块
例四
由于出题人懒得写背景了,题目还是简单一点好。
输入一个整数 \(n\) 和一个整数 \(p\),你需要求出:
其中 \(\gcd(a,b)\) 表示 \(a\) 与 \(b\) 的最大公约数。
对于100%的数据,\(5 \times 10^8 \leq p \leq 1.1 \times 10^9,n\le10^{10}\) 且 \(p\) 为质数。
一道比较套路的题
原式=
设\(f(x)=\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=x]ij,g(x)=\sum_{x|d}f(d)\)
展开\(g(x)\),有
所以回带,原式=
将\(T^2\varphi(T)\)的部分用杜教筛/Min25筛,另一部分数论分块即可
例五
设 \(d(x)\) 为 \(x\) 的约数个数,给定 \(n,m\),求
对于 \(100\%\) 的数据,\(1\le T,n,m \le 50000\)。
考虑拆开\(d\)函数
引理:\(d(ij)=\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]\)
证明:
考虑从质因数的角度,考虑简化版情况
-
\(i,j\)互质,此时右式的\(\gcd(x,y)\)显然成立,而左式的\(d(ij)=d(i)*d(j)\),成立
-
\(i=p^a,j=p^b,p\in primes\),此时显然有\(d(ij)=a+b+1\),而左式当且仅当\(x=1\)或\(y=1\),再加上\(x=1,y=1\)的情况,也有\(a+b+1\)个解
-
一般情况下,可以将\(ij\)分解质因数,然后因为左式是完全积性函数,仍成立,而右式根据乘法原理合并若干个\(a+b+1\),就正好可以合并出若干情况,其中乘1就是不考虑这个位的影响,\(a+b\)就是考虑这个质因数在累加上\([1,a+b]\),得证
那么原式即为
设\(f(x)=\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x]\left\lfloor\frac{n}{i}\right\rfloor \left\lfloor\frac{m}{j}\right\rfloor,g(n)=\sum_{n|d}f(d)\)
展开\(g(x)\),得到
回带,原式即为求\(f(1)=\sum_{i=1}^n\mu(i)g(i)\)
考虑如何求解\(g\),观察可得
设\(n'=\lfloor\frac{n}{x}\rfloor,m'=\lfloor\frac{m}{x}\rfloor\),则
那么两段式子明显可以预处理,设\(S(n)=\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\),则有
明显的,后半截的两个\(S\)可以数论分块
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 50050
#define int long long
int mu[N], s[N], n, m, t, prime[N], v[N];
int get(int n,int x) {
return n / (n / x);
}
void init() {
for (int i = 1; i <= N - 5; i++)mu[i] = 1;
for (int i = 2; i <= N - 5; i++) {
if (!v[i]) {
v[i] = 1;
mu[i] = -1;
for (int j = 2; i * j <= N - 5; j++) {
mu[i * j] *= -1;
v[i * j] = 1;
if (j % i == 0)mu[i * j] = 0;
}
}
}
// for (int i = 1; i <= 20; i++)cout << mu[i] << " ";
// cout << endl;
for (int i = 1; i <= N - 5; i++)mu[i] += mu[i - 1];
for (int i = 1; i <= N - 5; i++) {
for (int l = 1, r; l <= i; l = r + 1) {
r = get(i, l);
s[i] += (r - l + 1) * (i / l);
}
}
}
signed main() {
cin >> t;
init();
while (t--) {
cin >> n >> m;
if (n > m)swap(n, m);
int ans = 0;
for (int i = 1, j; i <= n; i = j + 1) {
j = min(get(n, i), get(m, i));
ans += (mu[j] - mu[i - 1]) * s[m / i] * s[n / i];
}
cout << ans << "\n";
}
}
事实上,这个性质还可以推广,证明类似
一般形式:
甚至于还可以扩展到\(\sigma_k(n)=\sum_{d|n}d^k(上式即为k=0时)\)