数论大合集(柿子版)
先引入一些概念:
- 数论函数:定义域为正整数的函数。
- 积性函数:如果函数 \(f(n)\) 满足当 \(\gcd(n,m)=1\) 时 \(f(nm)=f(n)f(m)\),那么我们称 \(f(n)\) 为积性函数。
- 完全积性函数:就是积性函数去掉那个互质的条件。
- 艾弗森约定:对于布尔型变量 \(x\):\([x]\) 表示 \(x\) 为真时取 1,为假时取 0。
- 点积 \((f\cdot g)(n)=f(n)g(n)\)
一些简单的例子:
- 元函数 \(\varepsilon(n)=[n=1]\) 根据定义,是完全积性的。
- 幂函数 \(id_k(n)=n^k\) 根据定义,是完全积性的。
- 单位函数 \(1(n)=id_0(n)\)。
- 约数幂函数 \(\sigma_k(n)=\sum_{d|n}d^k\),根据定义是积性的。
- 欧拉函数 \(\varphi(n)=\sum_{d\leq n}[\gcd(d,n)=1]\) 是积性的,具体形式和证明下叙。
- 莫比乌斯函数 \(\mu(n)\) 满足 \(\sum_{d|n}\mu(d)=[n=1]=\varepsilon(n)\) 是积性的,具体形式和证明下叙。
「下叙」
\(\varphi(n)\):我们先将 \(n\) 素因数分解为标准形式:
那么我们有容斥形式:
然后做简单的乘法分配律就有:
于是这个形式显然是积性的。
一个性质:
这个的证明可以考虑组合意义。
\(\mu(n)\):自己推一下显然有形式:
那么显然是积性的。
假设 \(f(n)\) 和 \(g(n)\) 是数论函数,那么我们定义它们的狄利克雷卷积(Dirichlet Convolution)为:
一些性质:
- 狄利克雷卷积满足交换律
- 狄利克雷卷积满足结合律
- 如果 \(f\) 和 \(g\) 都是积性的,那么 \(f\otimes g\) 也是积性的
一些例子:
一道简单的习题:
求
\[\sum_{i=1}^n\sum_{k|i}f(k)\mu(\frac ik)\bmod 10^9+7 \]的值,其中
\[f(n)=\sum_{d|n}\varphi(d)\sigma_0(\frac nd) \]\(n\leq 10^{10^6}\),时限 1s,由于是式子题,请给出严格证明。
sol.
注意到
所以
那么回归原式:
那么原式就等于
注意到我们有一个特殊的卷积式:
那么如果我们知道 \(f(n)=\sum_{d|n}g(d)\),亦即 \(f=g\otimes 1\),那么根据卷积式以及我们知道的运算律,有
写成常见形式就是:
一些例题:
化简求值:
\[\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j) \]\(n\leq 10^6\)
sol.
这类枚举 gcd 的问题有经典套路:先枚举 gcd,然后
试 一 试
然后这里观察一下组合意义:后面两个和号相当于在枚举 \(\leq n/d\) 的数中有多少对互素的,这就是 \(2\sum_{k=1}^{n/d}\varphi(k)-1\),减一是因为 1 和自己只能算一次。
那么就是
于是这个可以 \(\mathcal{O}(n)\) 做。
加强版
化简求值:
\[\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j) \]\(n\leq 10^6\),多组数据 \(T\leq 10^4\)
sol.
首先我们先拿着之前的柿子化一下:
其中
这个可以预处理出来。然后呢?
然后我们发现,对于很多的 \(d\),\(n/d\) 的取值都相同。确切来说,最多只有 \(\mathcal{O}(\sqrt n)\) 种不同的取值。那么我们可以对于相同的一部分值一起处理(就是前缀和减一减),于是就可以单次 \(\mathcal{O(\sqrt n)}\) 做。
for(int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
ans += (S(r) - S(l - 1)) * Phi(n / l);
}
另一个加强版
化简求值:
\[\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j) \]\(n, m\leq 10^6\)
sol.
现在就没办法使用 \(\varphi\) 来化简了,怎么做?
首先先假定 \(n\leq m\),那么按照上面的做法化简:
这时候我们注意到后面是一个元函数的形式,于是我们可以将其反演出来:
现在复杂度就是调和级数一个 \(\log\) 了,但是我们再化简试试?
我们令 \(T=kd\),然后:
然后注意到后面这个东西就是 \(\varphi\),于是可以线性筛,总复杂度 \(\mathcal{O(n)}\)
究极加强版
化简求值:
\[\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j) \]\(n, m\leq 10^6\) 多组数据 \(T\leq 10^4\)
sol.
一样的套路,整除分块即可。
如果你坚持看到了现在那你大概率会发现,数论的很多柿子都需要前缀和,如何快速(亚线性地)求前缀和呢?
我们假定现在要求 \(F(n)=\sum_{i=1}^nf(i)\),那么我们找到它的一个狄利克雷卷积式 \(h=f\otimes g\),然后我们来考虑 \(h\) 的前缀和 \(H\):
我们现在交换和号:
于是移一移:
然后后面的东西可以整除分块递归下去做。复杂度是 \(\mathcal{O}(n^{3/4})\),如果预处理前 \(n^{2/3}\) 处的取值并记忆化搜索就是 \(\mathcal O(n^{2/3})\),而且记忆化搜索后的复杂度是和调用次数无关的(就是说即使在整除分块内部使用也不影响复杂度)。
来丶例题
第五次加强
化简求值:
\[\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j) \]\(n, m\leq 10^{10}\)
sol.
还是上面的函数,令 \(f(n)=\varphi(n)\),\(g(n)=1\),于是 \(h=id_1\)。于是可以做了。