数论反演

Prepare

  1. \([P]\) 表示当 \(P\) 为真时 \([P]\) 为 1,否则为 0。

  2. \(a|b\)\(b\)\(a\) 整除。

  3. 一些常见的奇怪函数:

\(I(n)=1\)

\(id(n)=n\)

\(d(n)=n\) 的约数个数

\(\sigma_i(n)=\sum_{d|n}d^i\),其中 \(\sigma_0=\tau=d(n),\sigma_1=\sigma\)

\(\epsilon (n)=[n==1]\)

狄利克雷卷积

  • 数论函数

数论函数 \(f: N\rightarrow C\) 指一类定义域是自然数,值域是一个复数集的函数。

我们将这样的数论函数集合记作 \(A\)

加法:逐项相加就可以辣 \((f+g)(x)=f(x)+g(x)\)

数乘:用一个常数乘 \((xf)(n)=x\cdot f(n)\)

  • 狄利克雷卷积

定义两个数论函数的狄利克雷卷积 ∗:

定义卷积 \(t=f∗g\) 为:

\[t(n)=\sum_{i|n}f(i)g({n\over i}) \]

也可以写成

\[t(n)=\sum_{ij=n}f(i)g(j) \]

狄利克雷卷积有以下性质(两个数论函数相等,是指两个函数的每一项都相等):

  1. 交换律:\(f∗g=g∗f\)

\[f\ast g(n)=\sum_{ab=n}f(a)g(b)=\sum_{ab=n}g(a)f(b)=(g\ast f)(n) \]

  1. 结合律:\(f∗(g∗h)=(f∗g)∗h\)

\[\begin{aligned} (f\ast (g\ast h))(n) &= \sum_{ab=n}f(a)\cdot(g\ast h)(b) \\\\ &=\sum_{ab=n}\left(f(a)\sum_{cd=b}g(c)h(d)\right) \\\\ &=\sum_{acd=n}f(a)g(c)h(d) \\\\ &=\sum_{ed=n}\left(h(d)\sum_{ac=e}f(a)g(c)\right)\\\\ &=(h\ast (f\ast g))(n) \\\\ &=((f\ast g)\ast h)(n) \end{aligned} \]

  1. 分配律:\(f\ast (g+h)=f\ast g+f\ast h\)

\[\begin{aligned} (f\ast (g+h))(n) &=\sum_{ab=n}f(a)\cdot(g+h)(b) \\\\ &=\sum_{ab=n}f(a)g(b)+f(a)h(b) \\\\ &=\sum_{ab=n}f(a)g(b)+\sum_{ab=n}f(a)h(b) \\\\ &=(f\ast g)(n)+(f\ast h)(n) \end{aligned} \]

  1. 没有名字:\((xf)\ast g=x(f\ast g)\)

  2. 单位元:\(\epsilon \ast f=f\),其中 \(\epsilon(n)=[n==1]\)

\[\sum_{d|n}f(d)\epsilon({n\over d})=f(n)\ast \epsilon(1)=f(n) \]

  1. 逆元:对于 \(f\in A\),存在 \(f^{-1}\in A\),使得 \(f\ast f^{-1}=\epsilon\) 当且仅当 \(f(1)\neq 0\)

证明:

(1)\(\Rightarrow\)

\(f\in A\),假设存在 \(f^{-1}\in A\),使得 \(f\ast f^{-1}=\epsilon\)

从而, \(f(1)f^{-1}(1)=(f\ast f^{-1})(1)=\epsilon(1)=1\),得 \(f^{-1}(1)={1\over f(1)}\),所以 \(f(1)\neq 0\)

(2)\(\Leftarrow\) 使用数学归纳法

Base Case:

\(n=1,g(1)={1\over f(1)}\),由于 \(f(1)\neq 0\),我们有

\[(f\ast g)(1)=f(1)g(1)=1=\epsilon(1) \]

Inductive Step:

假设 \(k\lt n\) 时,\(g(k)\) 都可以唯一定义,我们可以定义 \(g(n)\) 如下:

\[g(n)=-{1\over f(1)}\sum_{d|n,d\gt 1}f(d)g({n\over d}),n\gt 1 \]

\[\begin{aligned} (f\ast g)(n) &= \sum_{d|n}f(d)g({n\over d}) \\\\ &= f(1)g(n) + \sum_{d|n,d>1}f(d)g({n\over d}) \\\\ &= f(1)g(n) - f(1)g(n) \\\\ &= 0 \\\\ &= \epsilon(n) \\\\ \end{aligned} \]

  1. \(\mu \ast I=\epsilon\)

证明:

(1). 当 \(n=1\) 时,\(\epsilon(1)=\mu(1)\cdot I(1)=1\) 成立。

(2). 当 \(n\gt 1\) 时,

\[\begin{aligned} n&=p_1^{\alpha_1}\cdot p_2^{\alpha_2}\cdot p_3^{\alpha_3}\cdots p_s^{\alpha_s},(p_1\lt p_2\lt\dots\lt p_s,\alpha_i\in \mathbb{Z}^+)\\\\ d&=p_1^{\beta_1}\cdot p_2^{\beta_2}\cdot p_3^{\beta_3}\cdots p_s^{\beta_s},(0\le\beta_i\le\alpha_i) \end{aligned} \]

\(\beta_i=0\)\(1\) 时,\(\mu(d)\neq 0\),因此有:

\[\begin{aligned} \sum_{d|n}\mu(d)&=\mu(1)+\mu(p_1)+\mu(p_2)+\cdots+\mu(p_s)+\mu(p_1p_2)+\mu(p_1p_3)+\cdots+\mu(p_{s-1}p_s)+\cdots+\mu(p_1\cdots p_s)\\\\ &=1+C_s^1(-1)+C_s^2(-1)^2+\cdots+C_s^s(-1)^s\\\\ &=(1-1)^s\\\\ &=0 \end{aligned} \]

得证 \(\epsilon(n)=0,(n\gt 1)\)

莫比乌斯变换与反演

莫比乌斯变换

\(F=f\ast I\),则称 \(F\)\(f\) 的莫比乌斯变换,即

\[F(n)=\sum_{d|n}f(d)I(d)=\sum_{d|n}f(d) \]

  1. \(d=I\ast I\)

证明:

\[(I\ast I)(n)=\sum_{d|n}I(d)\cdot I\left({n\over d}\right)=\sum_{d|n}1=d(n) \]

  1. \(\sigma=I\ast id\)

证明:

\[(I\ast id)(n)=\sum_{d|n}I(d)\cdot id\left({n\over d}\right)=\sum_{d|n}I\left({n\over d}\right)\cdot id(d)=\sum_{d|n}d=\sigma(n) \]

莫比乌斯反演(反变换)

\(F=f\ast I\Leftrightarrow f=F\ast \mu\)

证明:

\(F\ast I=(f\ast I)\ast \mu=f\ast (I\ast \mu)=f\ast \epsilon=f\)

  1. \(\phi * I = id\)

证明:

\[(\phi\ast I)(n)=\sum_{d|n}\phi(d)\cdot I\left({n\over d}\right)=\sum_{d|n}\phi(d) \]

\(\sum_{d|n}\phi(d)\) 即为求对集合 \(\{1,2,\dots,n\}\)\(\equiv mod(n)\) 关系下的商集的各子集元素个数之和,恰为 \(n\) 本身。

  1. \(\mu * id = \phi\)

证明:由 \(\phi\ast I=id\),得

左边 \(= (\phi\ast I)\ast \mu=\phi\ast(I\ast\mu)=\phi\ast \epsilon=\phi \)

右边 \(=id\ast \mu=\mu\ast id\)

得证。

积性函数

如果一个数论函数 \(f\) 有当 \(gcd(n,m)=1\) 时,

\[f(nm)=f(n)f(m) \]

就称 \(f\) 为积性函数。

一些常见的积性函数:

\[\epsilon(n)=[n==1] \]

\[id(n)=n \]

\[idk(n)=nk \]

事实上他们也满足完全积性(即当 \(gcd(n,m)\neq 1\) 时,也有 \(f(nm)=f(n)f(m)\)

特殊的,我们令 \(id0(n)=I(n)=1\)

还有两个普通的积性函数

\(d(n)=n\) 的约数和

\(\varphi(n)=[1,n]\) 中与 \(n\) 互质的数的个数

还有两个重要结论:

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

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

积性函数有什么用呢?

它可以线性筛

然而还有更有用的−−−

莫比乌斯反演

  • 一些理论

我们定义 1 的逆是 \(\mu\)

这样的话,如果 \(g=f∗I\),就有 \(f=f*\epsilon=f∗I∗\mu =g∗\mu\)

换句话说,就是

\[g(n)=\sum_{d|n}f(d)\Leftrightarrow f(n)=\sum_{d|n}\mu({n\over d})g(d) \]

也可以写成

\[g(d)=\sum_{d|n}f(n)\Leftrightarrow f(d)=\sum_{d|n}\mu({n\over d})g(n) \]

  • 例1:求

\[\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==1] \]

解:

\[f(x)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==x] \]

\[g(x)=\sum_{x|d}f(d) \]

\[f(1)=\sum_{1|d}\mu({d\over 1})g(d) \]

\[f(1)=\sum_{i=1}^n\mu(i)g(i) \]

\[g(x)=\sum_{x|d}\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d] \]

\[g(x)=\sum_{i=1}^n\sum_{j=1}^m[x|gcd(i,j)] \]

\[g(x)=\sum_{i=1}^{\lfloor{n\over x}\rfloor}\sum_{j=1}^{\lfloor{m\over x}\rfloor}[1|gcd(i,j)] \]

\[g(x)={\lfloor{n\over x}\rfloor}{\lfloor{m\over x}\rfloor} \]

带回 \(f(1)\),得

\[Ans=\sum_{x=1}^n\mu(x){\lfloor{n\over x}\rfloor}{\lfloor{m\over x}\rfloor} \]

这个用整除分块可以做到 \(\sqrt{n}\)

  • 例2:求

\[\sum_{i=1}^n\sum{j=1}^mgcd(i,j) \]

解:

\[\sum_{d=1}^n\sum_{i=1}^n\sum{j=1}^md[gcd(i,j)==d] \]

\[\sum_{d=1}^nd\sum_{i=1}^{\lfloor{n\over d}\rfloor}\sum{j=1}^{\lfloor{m\over d}\rfloor}[gcd(i,j)==1] \]

\[x=\lfloor{n\over d}\rfloor,y=\lfloor{m\over d}\rfloor \]

\[\sum_{d=1}^nd\sum_{i=1}^x\sum{j=1}^y[gcd(i,j)==1] \]

套用例1的结果

\[\sum_{d=1}^nd\sum_{i=1}^x\mu(i)\lfloor{x\over i}\rfloor\lfloor{y\over i}\rfloor \]

\[\sum_{d=1}^nd\sum_{i=1}^{n\over d}\mu(i)\lfloor{x\over id}\rfloor\lfloor{y\over id}\rfloor \]

化到现在是 \(O(n)\) 的,因为前后都可以数论分块

但是我们能做得更好

\(T=id\)

原式化为

\[\sum_{d=1}^nd\sum_{i=1}^{n\over d}\mu(i)\lfloor{x\over T}\rfloor\lfloor{y\over T}\rfloor \]

\[\sum_{T=1}^n\lfloor{x\over T}\rfloor\lfloor{y\over T}\rfloor\sum_{d|T}d\mu({T\over d}) \]

乍一看还是O(n)的呀,但是对于后面那一部分

\[f(T)=\sum_{d|T}d\mu({T\over d})\Leftrightarrow f(T)=\sum_{ij=T}id(i)\mu(j) \]

两个积性函数相乘,可以线性筛呀!!

所以复杂度被我们压到了\(O(\sqrt{n})\)

线性筛

int prime[MAX_N], mu[MAX_N]
bool nprime[MAX_N]; 
void sieve() { 
	mu[1] = 1;
	for (int i = 2; i <= N; i++) {
		if (!nprime[i]) prime[++tot] = i, mu[i] = Mod - 1; 
		for (int j = 1; i * prime[j] <= N; j++) { 
			nprime[i * prime[j]] = 1; 
			if (i % prime[j] == 0) break; 
			mu[i * prime[j]] = Mod - mu[i]; 
		} 
	} 
} 

其实就是和筛素数的是一样的,if (i % prime[j] == 0) break;

这句话保证了复杂度,因为你存的素数是递增的,

如果 iprime[j] 整除后,i∗prime[j+k](k>0) 一定可以被 prime[j]∗x 的形式表示出来。

那么就有我们下面的一个问题:

  • 例3:给定你一个数组 \(f\),求:

\[\sum_{i=1}^n\sum_{j=1}^mf(gcd(i,j)) \]

其中 \(n,m\le 10^7\),数据组数 \(T\le 10^4\)

由我们上面推的东西,将f看作一个数论函数,可以知道只要求出一个函数 \(g=\mu∗f\) 的前缀和,

这个问题就解决了。

一下是解决这个问题的几种方法(蒯的):

void get_g_1(int N, const int *f, int *g) {
  for (int i = 1; i <= N; i++) g[i] = 0;
  for (int i = 1; i <= N; i++)
    for (int j = 1; i * j <= N; j++)
      g[i * j] = (g[i * j] + mu[i] * f[j]) % mod;
} // 依照定义,O(nlogn)

void get_g_2(int N, const int *f, int *g) {
  for (int i = 1; i <= N; i++) g[i] = f[i];
  for (int i = 1; i <= N; i++)
    for (int j = 2; i * j <= N; j++)
      g[i * j] = (g[i * j] - g[i]) % mod;
} // 类似求狄利克雷卷积逆的方式,不需要线性筛 mu ,O(nlogn)

void get_g_3(int N, const int *f, int *g) {
  for (int i = 1; i <= N; i++) g[i] = f[i];
  for (int i = 0; i < prime_count; i++)
    for (int j = N / prime[i]; j >= 1; j--)
      g[j * prime[i]] = (g[j * prime[i]] - g[j]) % mod;
} // Magic! O(nloglogn)

对于最后一种方法,理解成 \(dp\)

\[g_{i,n}=\sum_{d|n且d只包含前i种质因子}\mu(d)f({n\over d}) \]

那么转移:

\[g_{i,n}=\left\{ \begin{aligned} &g_{i-1,n} & & {p_i\nmid n} \\ &g_{i-1,n}-g_{i-1,{n\over p_i}} & &{p_i\mid n} \end{aligned} \right. \]

复杂度 \(O(nloglog\ n)\)

posted @ 2026-01-27 15:31  飞花阁  阅读(0)  评论(0)    收藏  举报
//雪花飘落效果