数论函数,筛法以及一些反演
基础知识
数论函数类别
下面列举一些常见数论函数。
单位函数 \(\epsilon(n)=[n=1]\)
常数函数 \(1(n)=1\)
恒等函数 \(\mathrm{id}_k(n) = n ^ k\)
除数函数 \(\sigma_k(n) = \sum\limits_{d\mid n}d ^ k\)
欧拉函数 \(\varphi(n) = \sum\limits_{i = 1} ^ n[i\perp n]\)
本质不同质因子个数 \(\omega(n) = \sum\limits_{p \in \mathbb{P}} [p\mid n]\)
莫比乌斯函数 \(\mu(n) = \begin{cases} 1 & n = 1 \\ 0 & \exists d > 1, d ^ 2\mid n \\ (-1) ^ {\omega(n)} & \mathrm{otherwise} \end{cases}\)
除了 \(\omega\) 是加性函数,其余都是积性函数。
一些常见等式
- 约数的 \(k\) 次方和
就是类似于普通的约数和公式,然后扩展成 \(k\) 次方版本。
筛积性函数
目的是在 \(O(n)\) 的时间内求出一些有特殊性质的积性函数 \(f(x)\) 在 \(x\in [1,n]\cap Z\) 处的点值。
这里的特殊性质是我们可以快速得到该函数在质数次幂处的函数值,这里的快速的要求是求 \(f(p^k)\) 要在 \(O(k)\) 的时间之内,但是一般常见的都是 \(O(1)\)。
-
在遇到质数 \(p\) 的时候,单独处理该处的函数值 \(f(p)\)。
-
对于 \(p_j\nmid i\) 时候,两者互质那么 \(f(i\times p_j)=f(i)\times f(p_j)\)。
-
对于 \(p_j\mid i\) 的时候,此时 \(p_j\) 为 \(i\) 的最小质因子。我们维护 \(i\) 的最小质因子的最高次幂的数 \(low_i\)。如果 \(low_i\neq i\),我们就尝试将其分离出来。$$f(i\times p_j)=f(\dfrac{i}{low_i})f(low_i\times j)$$
如果 \(low_i=i\),上述式子就无意义了,就是一个自己等于自己的式子。所以我们这个时候需要处理质数次幂 \(p^{k+1}\) 处的取值 \(f(p^{k+1})\)。
for(int i=2;i<=B;i++){
if(!vis[i]) p[++m]=i,f[i]=,low[i]=i;//计算质数处取值
for(int j=1;j<=m&&p[j]<=B/i;j++){
vis[i*p[j]]=1;
if(i%p[j]==0){
low[i*p[j]]=low[i]*p[j];
if(i==low[i]) f[i*p[j]]=;//计算质数次幂的取值
else f[i*p[j]]=f[i/low[i]]*f[low[i*p[j]]];
break;
}
low[i*p[j]]=p[j];
f[i*p[j]]=f[i]*f[p[j]];
}
}
基本筛法练习
欧拉函数
素数 \(p\),\(\varphi(p)=p-1\)
对于 \(p\nmid i\),\(\varphi(i\times p)=\varphi(i)\times \varphi(p)=\varphi(i)\times (p-1)\)
对于 \(p\mid i\),可以用 \(\varphi(n)=n\prod \dfrac{p_i-1}{p_i}\) 来推,由于 \(p\mid i\),所以 \(i\times p\) 的后半部分已经在 \(\varphi (i)\) 里面提供过了,只需要将前半部分的 \(n\to n\times p\) 即可。所以此时 \(\varphi(n)=p\times \varphi(i)\)。
void init(){
for(int i=2;i<=B;i++){
if(!vis[i]){ p[++cnt]=i; phi[i]=i-1; }
for(int j=1;j<=cnt&&i<=B/p[j];j++){
vis[i*p[j]]=p[j];
if(i%p[j]==0){ phi[i*p[j]]=phi[i]*p[j]; break; }
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
}
莫比乌斯函数
素数 \(p\),\(\mu(p)=-1\)。
对于 \(i\nmid p\),\(\mu (p\times i)=\mu(p)\times \mu(i)=-\mu(i)\)
对于 \(i\mid p\),\(\mu (p\times i)=0\)。
void init(){
mu[1]=1; memset(vis,0,sizeof(vis));
for(int i=2;i<=B;i++){
if(!vis[i]){ p[++cnt]=i; mu[i]=-1; }
for(int j=1;j<=cnt&&i<=B/p[j];j++){
vis[i*p[j]]=1;
if(i%p[j]==0) break;
mu[i*p[j]]=-mu[i];
}
}
}
约数个数函数
令 \(\tau(n)=\sigma_0(n)=\prod(a_i+1)\),其中 \(a_i\) 为每个质因数的最大指数。
按照上述通法求解即可,其中 \(\tau (p^k)=k+1\)。
对于 \(\sigma_k(n)\) 也是同理做法。
面对多组求解的情况下,当 \(n,k\le 10^7\),我们可以发现 \(p\le 4000,k\le 25\),记忆化一下即可。
约数和函数
\(\sigma_1(n)\) 的计算也是同上述通法。
其中 \(\sigma_1(p^k)=\sum\limits_{i=0}^kp^i\)。维护一下 \(low_i\) 和 \(minp_i\) 然后运用等比数列求和公式即可。
整除分块
快速处理数论问题的强大工具之一,用于快速处理形如 \(\sum f(\lfloor\dfrac{n}{i}\rfloor)g(i)\) 的问题。
这里需要用到的结论是:
\(\lfloor \dfrac{n}{i}\rfloor\) 的取值是 \(2\sqrt n\) 种的。
其中和 \(i\) 一个块的最右端点是 \(\lfloor\dfrac{n}{\lfloor\dfrac{n}{i}\rfloor}\rfloor\)
于是我们只需要对于每一段贡献,然后暴力跳右端点到下一段即可。
【扩展】向上取整
对于某个 \(l\),其右边界 \(r=\lfloor\dfrac{n-1}{\lceil\frac{n}{l}\rceil-1}\rfloor\)。特判 \(\lceil\frac{n}{l}\rceil=1\) 的情况,这个时候 \(r\) 直接取实际上限即可。
【扩展】高维数论分块
具有多个 \(n\) 怎么办?也就是面对 \(\sum\limits_{i}f(i)\prod\limits_{j}g(\lfloor\frac{n_j}{i}\rfloor)\) 的情况,
对于某个 \(l\),其右端点 \(r\),为所有 \(\min\limits_{j} \lfloor\dfrac{n_j}{\lfloor\dfrac{n_j}{l}\rfloor}\rfloor\)。暴力跳的时间复杂度为 \(O(\sum \sqrt n_i)\)。
P3935 Calculating
题目即求 \([l,r]\) 的数的约数个数和。我们可以做一个差分,用 \([1,r]-[1,l-1]\)。
考虑贡献法,对于一个数 \(i\),它可以对于 \(\lfloor\dfrac{n}{i}\rfloor\) 个数作出贡献。用数论分块算一下和即可。
P2261 [CQOI2007] 余数求和
常见技巧取模转整除,然后同理拆开式子维护即可。
需要注意的就是本题 \(n\) 可能大于 \(k\),所以有的 \(\lfloor\frac ki\rfloor\) 可能取 \(0\)。需要特判一下。
P2424 约数和
对于 \([1,n]\) 的约数和就是 \(\sum i\lfloor\frac ni \rfloor\)。
ARC068E Snuke Line
可以发现对于 \(d\) 合法的条件就是说存在整数在 \([\lfloor\dfrac{l}{d}\rfloor,\lfloor\dfrac rd \rfloor]\)。也就是说 \(\lfloor\dfrac{l-1}{d}\rfloor < \lfloor\dfrac{r}{d}\rfloor\)。
我们对于 \(l-1\) 数论分块,标记一下即可。
P2260 [清华集训 2012] 模积和
直接将 \(n\bmod i\) 转化为 \(n-\lfloor\dfrac{n}{i}\rfloor i\),对于 \(m\) 执行同样操作。
对于二者独立计算之后,乘在一起。注意要去掉 \(i=j\) 的情况,这个直接二维数论分块可以解决。
P3579 [POI 2014] PAN-Solar Panels
直接对于 \((b,d)\) 进行二维数论分块。
发现取 \(r\) 的时候不管从约束角度还是从题目要求最大角度都是最优的,直接对于这个数 check 就行了。
CF1603C Extreme Extension
数论分块优化 DP。
一个数字只可能变小不可能变大,所以如果我们从前往后推,遇到后面的很小数字还要反过头对于前面修改,这个是很劣的策略。于是我们考虑从后往前推,这样子每次当前的数字只需要分裂得比上一个数字更小就行了。
假设目前的数字为 \(a_i\),倒序扫描之后上一个数字为 \(A\),我们要分裂为 \(\{b_1,b_2\dots b_k\}\),满足 \(b_k\le A\) 的情况下,我们至少要分 \(\lceil{\dfrac{A}{a_{i+1}}}\rceil\) 次,且最大化 \(b_1\) 为 \(\lfloor{\dfrac{A}{\lceil{\frac{A}{a_{i+1}}}\rceil}}\rfloor\)。
以上过程是一个唯一确定的流程,不需要后续的调整或者多个决策的抉择。于是我们就可以为这个过程套上一个 DP 来计数了。
设 \(f_{i,j}\) 表示考虑了 \(k\in [i,n]\),有多少个区间 \([i,k]\) 经过最优操作之后使得 \(a_i\) 分裂出来的最小数字为 \(j\)。根据整除分块理论,这样子的固定 \(i\) 之后 \(j\) 最多有 \(O(\sqrt n)\) 种。因此 DP 的状态数是 \(O(n\sqrt n)\)。进行一些预处理和贡献计算之后容易做到 \(O(1)\) 转移。
欧拉函数专题
欧拉函数还有一部分知识是欧拉定理,这部分的笔记放在这里了。
\(\varphi(n)\) 表示 \([1,n]\) 中与 \(n\) 互质的数的个数。
其中 \(d=\gcd(x,y)\)。区间内部乘积的欧拉函数极值,可以按照 \(d\) 分类之后求支配对求解。
计算方法
-
对于质数 \(p\),\(\varphi(p^k)=(p-1)\times p^{k-1}\)。\(\le p^k\) 中不是 \(p\) 的倍数中的数都与 \(p^k\) 互质,所以结果就是 \(p^k-p^{k-1}=(p-1)\times p^k\)。
-
\(\varphi(n)\) 是积性函数,于是对于 \(a\) 与 \(b\) 互质,有 \(\varphi(ab)=\varphi(a)\varphi(b)\)。
-
\(\varphi(n)=n\prod\dfrac{p_i-1}{p_i}\)
-
若 \(p\) 为质数,\(\varphi(p)=p-1\)。
-
对于 \(a|b\),\(\varphi(ab)=a\varphi(b)\)
-
\(\varphi(n)=\begin{cases}p\times\varphi(\dfrac{n}{p})& p^2|n \\(p-1)\times\varphi(\dfrac{n}{p})& p^2\nmid n \end{cases}\)
其实就是将 \(n\) 拆分成 \(p\times \frac{n}{p}\),情况一就是 \(p\mid \dfrac{n}{p}\) 的情况,可以转化到定理五。情况二就是 \(p\nmid \frac{n}{p}\) 的情况,可以转化到定理二。
基本性质
-
(欧拉反演) \(\sum\limits_{d|n}\varphi(d)=n\)
证明:使 \(i<n,\gcd(n,i)=d\) 的 \(i\) 的个数为 \(\varphi(\dfrac{n}{d})\),于是 \(n=\sum\limits_{d|n}\sum\limits_{i=1}^n[\gcd(n,i)=d]=\sum\limits_{d|n}\varphi(\dfrac{n}{d})\)。 -
若 \(a|b\),则 \(\varphi(a)|\varphi(b)\)。
-
对 \(n>2\),\(2|\varphi(p)\)
-
对于所有 \(1\le x\le n\),使得 \(\gcd(n,x)=d\) 成立的 \(x\) 个数为 \(\varphi(\dfrac{n}{d})\)。
P2158 [SDOI2008] 仪仗队
转为互质对数,然后对于欧拉函数求和即可。
U403635 鬼吹灯
感谢学长 chengch 给的题目。
给出整数 \(n\),求 \(\sum\limits_{i=0}^n(-1)^i\gcd(n,i)\),其中 \(n\le 4\times 10^{16}\)。
\(n\) 为奇数时,注意到 \(\gcd(n,i)=\gcd(n,n-i)\),且 \(i\) 和 \(n-i\) 奇偶性不同。
因此 \(S=\sum_{i=0}^{n}(-1)^i\gcd(n,i)=\sum_{i=0}^{n}(-1)^{n-i}\gcd(n,n-i)=-S\),故 \(S=0\)。
只需要讨论 \(n\) 为偶数的情况即可。
考虑一个经典的处理手法就是我们枚举约数 \(d\) 之后尝试变成欧拉函数求和。
求和中 \((-1)^{jd}\) 比较棘手,考虑分 \(d\) 奇偶讨论:
蓝色部分是因为 \(n\) 是偶数,\(d\) 是奇数,因此 \(\frac{n}{d}\) 是偶数,\(j\) 与 \(\frac{n}{d}\) 互质,因此 \(j\) 是奇数。
做法一:枚举 \(d\),暴力算 \(\varphi(n/d)\),时间复杂度为 \(T(n)=\sum_{d\mid n}\sqrt{d}=O(n^{0.5+\epsilon})\),可以通过。
证明:考虑设 \(n\) 的标准分解为 \(\prod_{i=1}^{k}p_i^{\alpha_i}\),记 \(q_i=\sqrt{p_i}\)。
\[\begin{aligned} \sum_{d|n}\sqrt d&=\prod_{i=1}^{k}(1+q_i+\cdots+q_i^{\alpha_i})\\ &=\prod_{i=1}^{k}q_i(1+q_i^{-1}+\cdots+q_i^{-\alpha_i})\\ &=\sqrt{n}\prod_{i=1}^{k}(1+q_i^{-1}+\cdots+q_i^{-\alpha_i})\\ &<\sqrt{n}\prod_{i=1}^{k}\sum_{j=0}^{+\infty}q_i^{-j}\\ &=\sqrt{n}\prod_{i=1}^{k}\frac{1}{1-q_i^{-1}} \end{aligned} \]即每个不同的质数 \(p_i\) 除了 \(\sqrt{n}\) 之外贡献为 \(\frac{1}{1-q_i^{-1}}=\frac{\sqrt{p_i}}{\sqrt{p_i}-1}\)。我们可以取某个 \(N\),把 \(\prod_{i=1}^{N-1}\frac{\sqrt{p_i}}{\sqrt{p_i}-1}\) 当作常数,而后面的质数都放缩成 \(p_N\),则时间复杂度为 \(O(n^{0.5}(\frac{\sqrt{p_N}}{\sqrt{p_N}-1})^{\log_{p_N}n})=O(n^{0.5+\log_{p_N}(\frac{\sqrt{p_N}}{\sqrt{p_N}-1})})\),\(\log_{p_N}(\frac{\sqrt{p_N}}{\sqrt{p_N}-1})\) 可以任意小,因此时间复杂度不超过 \(O(n^{0.5+\epsilon})\)。
做法二:对 \(n\) 质因数分解,dfs 搜索每个质因数,同时算出其 \(\varphi\),时间复杂度 \(O(d(n))\)。
做法三:考虑 \(A(n)=\sum_{d|n}(-1)^{d+1}d\varphi(\frac{n}{d})\),答案为 \(n-A(n)\)。
设 \(f(d)=(-1)^{d+1}d\),\(f,\varphi\) 都是积性函数,且 \(A=f*\varphi\),因此 \(A\) 是积性函数,只要计算质数幂次的取值。
注意 \(A(p^k)=\sum_{i\le k}(-1)^{p^i+1}p^i\varphi(p^{k-i})\),利用等比数列求和可以 \(O(1)\) 计算。因此能做到和质因数分解相同的时间复杂度。
狄利克雷卷积 Dirichlet
直接做的时间复杂度是 \(O(n\log n)\)。
性质
交换律,结合律,分配律
\(\epsilon*f=f\)
\(f\) 可逆,当且仅当 \(f(1)\neq 0\)
设 \(f\) 的逆为 \(g\),那么 \(g(1)=1\),且 \(g(n)=-\dfrac{\sum\limits_{d\mid n,d\neq n} g(d)f(\frac{n}{d})}{f(1)}\)
\(f=g\) 的充要条件是 \(f*h=g*h\),且 \(h(1)\neq 0\)。
积性函数的狄利克雷卷积是积性函数。
积性函数的逆元是积性函数。
常用变换
相当于 \(\sum\limits_{d\mid n}\mu(d)=[n=1]\)。
直接就是 \(\sum\limits_{d\mid n} 1=\sigma_0(n)\)
也就是说 \(\sum\limits_{d\mid n}\varphi(d)=n\),这个式子也是欧拉反演。
两边同乘以 \(\mu\),等价于证明 \(\varphi=\mathrm{id}*\mu\)。利用莫比乌斯函数相关结论可证。
这个很显然,\(\sum\limits_{d\mid n}d=\sigma (n)\)
综上所述有,
逆变换就是 \(*\mu\),即 \(1\) 的逆元。
莫比乌斯反演
定义
莫比乌斯函数 \(\mu(n)=\begin{cases}0& \exists d>1 \\(-1)^{\omega(n)} &\operatorname{otherwise} \end{cases}\)
其中 \(\omega(n)\) 代表 \(n\) 的质因子个数。
莫比乌斯反演
这就是 \(\mu * 1=\epsilon\)。
\(\varphi(n)=\sum\limits_{d|n}d\times\mu({\dfrac{n}{d})}\),变式:\(\dfrac{\varphi(n)}{n}=\sum\limits_{d|n}\dfrac{\mu(\frac{n}{d})}{d}\)。
反演公式
\(\mu\) 是 \(1\) 的逆元。
例题
P12599 常数要较小
\(\mu(ij)>0\) 的一个必要条件是 \(\gcd(i,j)=1\),所以上述式子可以转化为
互质情况下,\(\mu(ij)=\mu(i)\mu(j)\)。拆开即可。
令 \(f(n)=n\mu(n)\sum\limits_{i=1}^n[\gcd(n,i)=1]i\mu(i)\),则上述式子为 \(2\sum\limits_{i=1}^n f(i)-1\)。
使用莫比乌斯反演处理后面这个式子,得到
枚举 \(d\) 向上贡献即可。时间复杂度 \(O(T+n\log n)\)。

浙公网安备 33010602011771号