数论函数,筛法以及一些反演

基础知识

数论函数类别

下面列举一些常见数论函数。

单位函数 \(\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\) 次方和

\[\sigma_k(n)=\begin{cases} \prod\limits_{i = 1} ^ m (c_i + 1) & k = 0 \\ \sum\limits_{i = 1} ^ m \frac{p_i ^ {(c_i + 1)k} - 1}{p_i^k - 1} & k > 0\end{cases} \]

就是类似于普通的约数和公式,然后扩展成 \(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\) 互质的数的个数。

\[\varphi(xy)=\varphi(x)\times \varphi(y)\times \dfrac{d}{\varphi(d)} \]

其中 \(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\) 之后尝试变成欧拉函数求和。

\[\begin{aligned} &\sum_{i=1}^{n}(-1)^i\gcd(n,i)+n\\ =&\sum_{d\mid n}d\sum_{j=1}^{n/d}(-1)^{jd}[\gcd(j,\frac{n}{d})=1]+n\\ \end{aligned} \]

求和中 \((-1)^{jd}\) 比较棘手,考虑分 \(d\)​ 奇偶讨论:

\[\begin{aligned} &\sum_{d\mid n,2\mid d}d\sum_{j=1}^{n/d}[\gcd(j,\frac{n}{d})=1]+\sum_{d \mid n,2 \nmid d}d\sum_{j=1}^{n/d}(-1)^j[\gcd(j,\frac{n}{d})=1]+n\\ =&\sum_{d\mid n,2\mid d}d\varphi(\frac{n}{d})\textcolor{blue}{-\sum_{d\mid n,2\nmid d}d\varphi(\frac{n}{d})}+n\\ =&\sum_{d|n}(-1)^dd\varphi(\frac{n}{d})+n \end{aligned} \]

蓝色部分是因为 \(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

\[h(n)=\sum\limits_{d\mid n}f(d)g(\dfrac{n}{d}) \]

直接做的时间复杂度是 \(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\)

积性函数的狄利克雷卷积是积性函数。

积性函数的逆元是积性函数。

常用变换

\[\mu*1=\epsilon \]

相当于 \(\sum\limits_{d\mid n}\mu(d)=[n=1]\)

\[1*1=\sigma_0 \]

直接就是 \(\sum\limits_{d\mid n} 1=\sigma_0(n)\)

\[\varphi*1=\mathrm{id} \]

也就是说 \(\sum\limits_{d\mid n}\varphi(d)=n\),这个式子也是欧拉反演。

两边同乘以 \(\mu\),等价于证明 \(\varphi=\mathrm{id}*\mu\)。利用莫比乌斯函数相关结论可证。

\[\mathrm{id}*1=\sigma \]

这个很显然,\(\sum\limits_{d\mid n}d=\sigma (n)\)

综上所述有,

\[\mu \stackrel{*1}{\rightarrow}\epsilon \stackrel{*1}{\rightarrow}1 \stackrel{*1}{\rightarrow}\sigma_0 \]

\[\varphi \stackrel{*1}{\rightarrow}\text{id} \stackrel{*1}{\rightarrow}\sigma \]

逆变换就是 \(*\mu\),即 \(1\) 的逆元。

\[\sigma_0(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j}\epsilon((i,j)) \]

\[\sigma_1(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j}\frac{xj}{y}\epsilon((i,j)) \]

莫比乌斯反演

定义

莫比乌斯函数 \(\mu(n)=\begin{cases}0& \exists d>1 \\(-1)^{\omega(n)} &\operatorname{otherwise} \end{cases}\)

其中 \(\omega(n)\) 代表 \(n\) 的质因子个数。

莫比乌斯反演

\[\sum\limits_{d|n}\mu(d)=\begin{cases}1&n=1 \\0 &n>1 \end{cases}\]

这就是 \(\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}\)

\[\sum\limits_{d|\gcd(i,j)}\mu(d)=[\gcd(i,j)=1] \]

反演公式

\[f(n)=\sum\limits_{d|n}g(d) \Rightarrow g(n)=\sum\limits_{d|n}\mu(d)\times f(\dfrac{n}{d}) \]

\(\mu\)\(1\) 的逆元。

例题

P12599 常数要较小

\(\mu(ij)>0\) 的一个必要条件是 \(\gcd(i,j)=1\),所以上述式子可以转化为

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^n[\gcd(i,j)=1]ij\mu(ij) \]

互质情况下,\(\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\)

使用莫比乌斯反演处理后面这个式子,得到

\[\sum\limits_{i=1}^ni\mu(i)\sum\limits_{d\mid i,d\mid n}\mu(d) \]

枚举 \(d\) 向上贡献即可。时间复杂度 \(O(T+n\log n)\)

posted @ 2024-11-07 12:24  Mirasycle  阅读(80)  评论(0)    收藏  举报