定义域为正整数,值域为整数的函数称为数论函数。OI中经常使用的数论函数有$\mu$,$\varphi$等。函数
积性函数
彻底积性函数:$f(ab)=f(a)f(b)$优化
通常积性函数:$f(ab)=f(a)f(b),a \perp b$spa
常见的积性函数以下:code
莫比乌斯函数 | $\mu(n)$ |
---|---|
欧拉函数 | $\varphi(n)$ |
单位函数 | $\text{id}(n)=n$ |
元函数 | $\epsilon(n)=[n=1]$ |
恒等函数 | $I(n)=1$ |
约数个数 | $d(n)=\sum\limits_{i=1}^n[i |
约数和 | $\sigma(n)=\sum\limits_{i |
狄利克雷卷积
两个函数$f,g$的狄利克雷卷积$t$:递归
$$t(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d})$$it
记为$t = f \ast g$table
一个重要的性质:两个积性函数的狄利克雷卷积仍为积性函数ast
整除分块
假如说咱们要求解$$\sum\limits_{i=1}^{n}\left \lfloor n \over i \right \rfloor$$class
直接模拟是$O(n)$的。而咱们发现$\left \lfloor \dfrac{n}{i} \right \rfloor$在$i$相近时会有不少重复的值。整除分块的思想就是将全部重复的数值一块儿计算。效率
有结论$\left \lfloor \dfrac{n}{i} \right \rfloor .. \left \lfloor \dfrac{n}{n/(n/i)} \right \rfloor$的值都是相等的,而$\left \lfloor \dfrac{n}{i} \right \rfloor$总共有不超过$2\sqrt{n}$个取值。所以复杂度是$O(\sqrt{n})$。
莫比乌斯函数
定义
考虑一个函数$F(n)=\sum\limits_{d|n}f(d)$,可否经过对$f$进行容斥得出$F$?其容斥系数知足什么特定规律吗?
咱们发现$F$的定义实际上是个狄利克雷卷积的形式。即$F=f \ast I$
所以$f$即为$F$卷上“$I$的狄利克雷逆”。由此咱们便定义这个容斥系数,也就是莫比乌斯函数$\mu$,为$I$的逆。即
$$\mu \ast I = \epsilon(n)$$
或
$$\sum\limits_{d|n}\mu(d)=[n=1]=\epsilon(n) \tag{1.1}$$
莫比乌斯函数的性质
性质一
$\mu$函数为积性函数。即
$$\mu(m \ast n) = \mu(m) \ast \mu(n), \ \ \ m \perp n \tag{1.2}$$
性质二
由此任意的莫比乌斯函数均可以表示为$\mu(n)=\prod\limits_{i} \mu(p_i^{y_i})$ (分解质因数)
$p^y$很特殊,根据以前的结论有$\sum\limits_{d|p^y}\mu(d)=0$,所以$\mu(1)+\mu(p)+\mu(p^2)+ \cdots \mu(p^y)=0$
由此猜想莫比乌斯函数值的性质:$\mu(1)=1,\mu(p)=-1$,而且对于全部指数$y$大于$1$的,知足$\mu(p^y)=0$
也就是:
$$\mu(d) = \begin{cases} 1 & d=1 \ (-1)^y & d=p_1 \ast p_2 \ast \cdots \ast p_y \ 0 & otherwise\end{cases} \tag{1.3}$$
这个结论是正确的。咱们能够用二项式定理证实这样的性质知足莫比乌斯函数的定义:
$n>1$时,将$n$分解质因数得$n=p_1^{y_1} \ast p_2^{y_2} \ast ... \ast p_k^{y_k}$。任何一个质数的个数超过$1$时莫比乌斯函数值必定为$0$,能够无论。咱们只须要考虑有多少个质因数的指数都为$1$。所以有
$$ \begin{aligned} & \sum\limits_{d|n} \mu(d) \ =& \sum\limits_{i=0}^{k} C^{i}{k} \ast (-1)^i \ =& \sum\limits{i=0}^{k} \dbinom{k}{i} (-1)^i 1^{k-i} \ =& 0 \end{aligned} $$
线性筛
积性函数均可以由线性筛求得。代码以下:
inline void SieveMu(int n){ mu[1] = 1; for(int i = 2; i <= n; ++i){ if(!b[i]){ prm[++tot] = i; mu[i] = -1; } for(int j = 1; j <= tot && i*prm[j] <= n; ++j){ b[i*prm[j]] = 1; if(i % prm[j] == 0){ mu[i*prm[j]] = 0; break; }else{ mu[i*prm[j]] = -mu[i]; } } } }
莫比乌斯反演
根据莫比乌斯函数的定义,咱们发现莫比乌斯函数具备以下的反演原理。
公式 1
$$F(n)=\sum\limits_{d|n}f(d) \xrightarrow[]{反演} f(n)=\sum\limits_{d|n}\mu(d)F(\dfrac{n}{d}) \tag{1.4}$$
公式 2
$$F(n)=\sum\limits_{n|d}f(d) \xrightarrow[]{反演} f(n)=\sum\limits_{n|d}\mu(\dfrac{d}{n})F(d) \tag{1.5}$$
问题一
求$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m }[gcd(i,j) = k], (n < m ) $
直接经过定义来变形: $$ \begin{aligned} &=\sum\limits_{i=1}^{n/k}\sum\limits_{j=1}^{m/k}[gcd(i,j)=1] \ &=\sum\limits_{i=1}^{n/k}\sum\limits_{j=1}^{m/k}\sum\limits_{d|gcd(i,j)}\mu(d) \ &=\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{d|i}^{n/k}\sum\limits_{d|j}^{m/k}1\ &=\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{i=1}^{\left \lfloor \frac{n}{kd} \right \rfloor}\sum\limits_{j=1}^{\left \lfloor \frac{m}{kd} \right \rfloor} 1\ &= \sum\limits_{d=1}^{n}\mu(d)\left \lfloor \frac{n}{kd} \right \rfloor\left \lfloor \frac{m}{kd} \right \rfloor\ \end{aligned} $$
可使用整除分块$O(\sqrt{n})$求解。
将$gcd$换到外面枚举是一个经常使用的$trick$。
问题二
求$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j),(n<m)$
$$ \begin{aligned} &= \sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m}[gcd(i,j)=d] \ &=\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{n/d}\mu(i)\left \lfloor \dfrac{n}{i d} \right \rfloor \left \lfloor \dfrac{m}{id} \right \rfloor \ \end{aligned} $$
第一个$\sum$能够用整除分块,第二个也是。因而复杂度为$O(n)$。
咱们还能够进一步优化——设$T=i \cdot d$,则有
$$ \begin{aligned} &=\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu(\dfrac{T}{d})\left \lfloor \dfrac{n}{T} \right \rfloor \cdot \left \lfloor \dfrac{m}{T} \right \rfloor \ &=\sum\limits_{T=1}^{n}\left \lfloor \dfrac{n}{T} \right \rfloor \left \lfloor \dfrac{m}{T} \right \rfloor\sum\limits_{d|T}d\mu(\dfrac{T}{d}) \end{aligned} $$
后面部分$\sum\limits_{d|T}d\mu(\dfrac{T}{d})$是一个狄利克雷卷积,是一个积性函数,咱们能够在线性筛时筛出。而后直接整除分块就能够$O(\sqrt{n})$完成求解了。
将两个数的乘积设作一个变量进行恒等变形也是一个经常使用$trick$。
欧拉函数
定义
对于一个正整数$n$,小于$n$且与$n$互质的正整数个数记做$\varphi(n)$ 。
即
$$\varphi(n) = \sum\limits_{i=1}^{n-1}[gcd(n,i)=1] \tag{2.1}$$
其中特殊定义$\varphi(1)=1$
经常使用的欧拉函数值:$\varphi(p)=p-1, \ \varphi(p^k)=p^k-p^{k-1}$
其中,欧拉函数也是积性函数。知足$\varphi(nm)=\varphi(n)\varphi(m), \ n \perp m$,所以也能够经过线性筛求出。
既然这样,那么将$n$分解质因数获得$n=\prod\limits_{i}p_{i}^{k_i}$,则有$\varphi(n)=\prod\limits_{i}\varphi(p_i^{k_i})$。
因而就得出了$\varphi$的通项公式:
$$\varphi(n)=\prod\limits_{i}(p_i^{k_i}-p_i^{k_i-1})=n \prod\limits_{i}(1-{1 \over p_i}) \tag{2.2}$$
欧拉函数的性质
$$\sum\limits_{d|n}\varphi(d)=n \tag{2.4}$$
这个性质很是巧妙。这实际上是一个真分数约分的过程。
$$\frac{0}{12},\frac{1}{12},\frac{2}{12},\frac{3}{12},\frac{4}{12},\frac{5}{12},\frac{6}{12},\frac{7}{12},\frac{8}{12},\frac{9}{12},\frac{10}{12},\frac{11}{12}$$
约分后交换顺序获得
$$\frac{0}{1},\frac{1}{2},\frac{1}{3},\frac{2}{3},\frac{1}{4},\frac{3}{4},\frac{1}{6},\frac{5}{6},\frac{1}{12},\frac{5}{12},\frac{7}{12},\frac{11}{12}$$
固然这个性质能够表示成狄利克雷卷积的形式:
$$\sum\limits_{d|n}\varphi(d)I(\dfrac{n}{d})=n$$
也就是
$$\varphi \ast I = \text{id}$$
那么也就获得了
$$\varphi = \mu \ast \text{id} \tag{2.5}$$
即
$$\varphi(n) = \sum\limits_{d|n}\mu(d) \dfrac{n}{d} \ \ \ \Leftrightarrow \ \ \ \dfrac{\varphi(n)}{n} = \sum\limits_{d|n}\dfrac{\mu(d)}{d} \tag{2.6}$$
杜教筛
杜教筛要解决的问题时在低于线性的复杂度下求出积性函数的前缀和。
即求
$$S(n)=\sum\limits_{i=1}^{n}f(i)$$
咱们找另外一个积性函数$g$去卷$f$,令$h = f \ast g$。
那么
$$ \begin{aligned} \sum\limits_{i=1}^{n}h(i) &=\sum\limits_{i=1}^{n}(f*g)(i) \ &=\sum\limits_{i=1}^{n}\sum\limits_{d|i}^{i}g(d)f(\dfrac{i}{d}) \ &=\sum\limits_{d=1}^{n}g(d)\sum\limits_{d|i}^{n}f(\dfrac{i}{d}) \ &=\sum\limits_{d=1}^{n}g(d)\sum\limits_{i=1}^{\left \lfloor \frac{n}{d}\right \rfloor}f(i) \ &= \sum\limits_{d=1}^{n}g(d)S(\left \lfloor \frac{n}{d}\right \rfloor) \ \end{aligned} $$
咱们要求的是$S(n)$,所以考虑将它表示出来:
$$ \sum\limits_{i=1}^{n}h(i) = g(1)S(n)+\sum\limits_{d=2}^{n}g(d)S(\left \lfloor \frac{n}{d}\right \rfloor) $$
移项获得
$$ g(1)S(n) = \sum\limits_{i=1}^{n}(f*g)(i) -\sum\limits_{d=2}^{n}g(d)S(\left \lfloor \frac{n}{d}\right \rfloor) \tag{3.1} $$
这就是杜教筛的核心式子。这是一个递归式,若是咱们可以快速求得$f \ast g$以及$g$这两个函数的前缀和,那么就能够$O(n^{\frac{2}{3}})$求出$S(n)$。而难点就在于找出合适的$g$。
问题一
求出$S(n)=\sum\limits_{i=1}^{n}\mu(i)$
关于$\mu$的卷积,有$\mu \ast I = \epsilon$。$\epsilon$和$I$的前缀和都很是好求,所以咱们选择$I$来做为$g$。
根据$(3.1)$可得
$$1 \cdot S(n)=\sum\limits_{i=1}^{n}\epsilon(i) -\sum\limits_{d=2}^{n}1 \cdot S(\left \lfloor \frac{n}{d}\right \rfloor)$$
化简得
$$S(n)=1-\sum\limits_{d=2}^{n}S(\left \lfloor \frac{n}{d}\right \rfloor) \tag{3.2}$$
问题二
求出$S(n)=\sum\limits_{i=1}^{n}\varphi(i)$
欧拉函数有性质$(2.4):$$\varphi \ast I = \text{id}$。于是仍是选择$I$来做为$g$。
同理,根据$(3.1)$有
$$1 \cdot S(n)=\sum\limits_{i=1}^{n}\text{id}(i) -\sum\limits_{d=2}^{n}1 \cdot S(\left \lfloor \frac{n}{d}\right \rfloor)$$
化简得
$$S(n)=\dfrac{n(n+1)}{2}-\sum\limits_{d=2}^{n}S(\left \lfloor \frac{n}{d}\right \rfloor) \tag{3.3}$$
代码实现
这个递归式咱们经过记忆化搜索来实现。经过map
来储存筛过的值。
为了提升效率,能够先用欧拉筛筛出$\sqrt{n}$之内的前缀和,防止杜教筛在小数据范围内递归次数太多。后面部分经过整除分块来实现。
int DuJiaoMu(int n){ if(n <= B) return smu[n]; if(mp_mu[n]) return mp_mu[n]; int res = 1; for(int i = 2,j; i <= n; i = j+1){ j = n/(n/i); res -= (j-i+1)*DuJiaoMu(n/i); } return mp_mu[n] = res; }