数学
参考资料:
卷积与反演-luogu
狄利克雷卷积-知乎
狄利克雷卷积和莫比乌斯反演-知乎
莫比乌斯反演-oiwiki
整除分块-oiwiki
常用积性函数:
\(\bullet\) 单位函数 \(\varepsilon(n)\text{ = }\begin{cases}\text{1, while n=1}\\\text{0, otherwise}\end{cases}\)
\(\bullet\) 幂函数 \(\begin{cases}Id_k(x)\text{ = }x^k\\Id(x)\text{ = }x\text{, }k\text{ = }1\\1(x)\text{ = }1\text{, }k\text{ = }0\end{cases}\)
\(\circ\) 除数函数 \(\begin{cases}\sigma_k(n)\text{ = }\Sigma_{d\mid{n}}\text{ }d^k\\\sigma(n)\text{ = }\Sigma_{d\mid{n}}\text{ }d\text{, }k\text{ = }1\\d(n)\text{ = }\Sigma_{d\mid{n}}\text{ }1\text{, }k\text{ = }0\end{cases}\)
\(\circ\) 欧拉函数 \(\varphi(n)\text{ = }\Sigma_{i = 2}^n\text{ }\left[n\perp i\right]\text{ = }n\times\Pi_{p\mid{n}}\ \frac{p-1}{p}(p\in \{prime\})\)
其中 \(\bullet\) 表示完全积性函数
因为这些都是积性函数,它们都满足 \(f(1) = 1\)
(我们常用 \(f, g, h\) 来代表函数,在本篇中用来表示积性函数较多
狄利克雷卷积
狄利克雷卷积是定义在数论函数间的二元运算。
定义式为:
以下出现的 \(*\) 不是我们常理解的乘,而是卷
也会写为:
且若 \(f,g\) 是积性函数,则 \(f * g\) 也是积性函数
特殊函数的卷积:
- \(Id_k * 1\text{ = }\sigma_k\)
- \(\varphi * 1\text{ = }Id\)
- \(1 * 1\ =\ d\)
有趣的运算:
\(\sigma\ =\ Id * 1\ =\ \varphi * 1 * 1\ =\ \varphi * d\)
性质:
交换律: \(f * g = g * f\)
结合律: \((f * g) * h = f * (g * h)\)
分配律: \(f * (g + h) = f * g + f * h\)
分配律只在函数加法下有效
单位元:
\((\varepsilon * f)(n)\text{ = }\Sigma_{xy = n}\text{ }\varepsilon(x)f(y)\text{ = }f(n)\) ,所以单位函数 \(\varepsilon\) 是狄利克雷卷积的单位元
逆元:
若 \(f * g\text{ = }\varepsilon\) ,则称 \(g\) 是 \(f\) 的狄利克雷逆,记作 \(f^{-1}\)。
一个函数 \(f\) 存在狄利克雷逆的充要条件是 \(f(1) \ne 0\) ,且一个函数的狄利克雷逆是唯一的。
有 \((f * g)^{-1}\text{ = }f^{-1} * g^{-1}\)
当 \(f\) 为积性函数的时候,\(f^{-1}\) 也是积性函数
莫比乌斯反演
这里我们补充一个积性函数:
\(\circ\) 莫比乌斯函数 \(\mu(n)\ =\ \begin{cases}1\qquad \ \ n=1\\0\qquad \ \ n\ \text{含有平方因子}\\(-1)^k\ \ k\ \text{为}\ n\ {的本质不同质因子个数}\end{cases}\)
嗯,很复杂,但没关系,我们只要记住它下面这个性质就好:
即
\(\Sigma_{d\mid{n}}\mu(d)\ =\ \varepsilon(n)\)
\(\mu * 1\ =\ \varepsilon\)
这说明,莫比乌斯函数是常数函数 \(1\) 的逆,也就是
\(1^{-1}\ =\ \mu\)
反演公式:
\(g = f * 1 \Leftrightarrow g * \mu = f\)
展开为:
\(g(n) = \Sigma_{d\mid{n}}\ f(d)\ \Leftrightarrow\ f(n) = \Sigma_{d\mid{n}}\ \mu(d)g(\tfrac{n}{d})\)
反演结论:
- \([gcd(i,j)\ =\ 1]\ =\ \Sigma_{d\mid{gcd(i,j)}}\ \mu(d)\)
通过 \(\mu * 1\ =\ \varepsilon\) 可以快速并简单地证明出这点。 - \(\varphi = Id * \mu\)
线性筛 \(O(n)\) 求莫比乌斯函数:
很多积性函数都是可以通过线性筛 \(O(n)\) 求出的,只是方法不尽相同
mu[1] = 1;
for(int i = 2; i <= n; ++ i){
if(!b[i]){
s[++ tot] = i;
mu[i] = -1;
}
for(int j = 1; j <= tot && i * s[j] <= n; ++ j){
b[i * s[j]] = 1;
if(!(i % s[j])){
mu[i * s[j]] = 0;
break;
}
mu[i * s[j]] = -mu[i];
}
}
整除分块:
也常被称为数论分块
能用到整除分块的式子形式大抵是这样的:
在很多数学题中会出现它,且我们用 \(O(n)\) 的复杂度去求有时是会超时的,怎么办呢?
通过打表发现许多 \(\lfloor \frac{n}{i} \rfloor\) 的值是相同的,并成一个块状分布。且可以发现对于每一个值相同的块,它最后一个位置为 \(n / (n / i)\) ,这样我们就可以 \(O(\sqrt{n})\) 计算了
参考代码:
for(int l = 1, r; i <= n; l = r + 1){
r = (n / (n / l));
ans += (r - l + 1) * (n / l);
}
有帮助的题:
题意:
给定 \(n, m\) ,求
很明显,推式子:
以下的式子默认 \(n <= m\)
考虑枚举 \(gcd(i, j)\)
\(i, j\) 同时乘上 \(d\) (将 \([gcd(i,j)=d]\) 变为 \([gcd(i,j)=1]\))
再次将 \(i, j\) 全体乘 \(k\)
好,让我们猜猜这个式子的计算复杂度是多少。
.
.
.
\(O(n)\)
对,\(O(n)\) 。因为这个式子可以拆为两个整除分块来做。
直接说可能抽象了,我们再来拆拆式子,设
明显前半部分是可以 \(O(n)\) 预处理的,关于后半部分的计算,再设
于是
呦,整除分块,复杂度 \(O(\sqrt{n})\)
再看看原式
多眼熟,又是整除分块,总体复杂度 \(O(\sqrt{n}* \sqrt{n})=O(n)\)