# [复习]莫比乌斯反演,杜教筛,min_25筛

## 莫比乌斯反演

\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_{n|d}\mu(\frac{d}{n})g(d)\end{aligned}

\begin{aligned}g(n)&=\sum_{d|n}f(d)\\f(n)&=\sum_{d|n}\mu(\frac{n}{d})g(d)\end{aligned}

• 【BZOJ1101】ZAP
题意：求$\displaystyle \sum_{i=1}^a\sum_{j=1}^b[gcd(i,j)==d]$
题解：
$\displaystyle f(d)=\sum_{i=1}^a\sum_{j=1}^b[gcd(i,j)==d],g(n)=\sum_{n|d}f(d)$
那么通过式子的含义不难知道$\displaystyle g(d)=\sum_{i=1}^a\sum_{j=1}^b[d|gcd(i,j)]$
那么推导就很简单了

\begin{aligned} g(d)&=\sum_{i=1}^a\sum_{j=1}^b[d|gcd(i,j)]\\ &=\sum_{i=1}^{a/d}\sum_{j=1}^{b/d} [1|gcd(i,j)]\\ &= \lceil \frac{a}{d} \rceil* \lceil \frac{b}{d} \rceil\\ f(d)&=\sum_{d|i}\mu(\frac{i}{d})g(i)\\ &=\sum_{d|i}\mu(\frac{i}{d})\lceil \frac{a}{i} \rceil* \lceil \frac{b}{i} \rceil\\ &=\sum_{i=1}^{min(a,b)/d}\mu(i)\lceil \frac{a/d}{i} \rceil* \lceil \frac{b/d}{i} \rceil\\ \end{aligned}\\

\begin{aligned} Ans&=\sum_{i=1}^n\sum_{j=1}^m lcm(i,j)\\ &=\sum_{i=1}^n\sum_{j=1}^m \frac{ij}{gcd(i,j)}\\ &=\sum_{d=1}^n\frac{1}{d}\sum_{i=1}^n\sum_{j=1}^m [gcd(i,j)=d]ij\\ &=\sum_{d=1}^nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} [gcd(i,j)=1]ij \end{aligned}

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

\begin{aligned} g(d)&=\sum_{i=1}^n\sum_{j=1}^m[d|gcd(i,j)]ij\\ &=d^2\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}ij\\ &=d^2 S([\frac{n}{d}])S([\frac{m}{d}]) \end{aligned}

\begin{aligned} Ans&=\sum_{d=1}^nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} [gcd(i,j)=1]ij\\ &=\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)i^2S([\frac{n}{id}])S([\frac{m}{id}]) \end{aligned}

\begin{aligned} Ans&=\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)i^2S([\frac{n}{id}])S([\frac{m}{id}])\\ &=\sum_{T=1}^nS([\frac{n}{T}])S([\frac{m}{T}])\sum_{d|T,id=T}d\mu(i)i^2\\ &=\sum_{T=1}^nS([\frac{n}{T}])S([\frac{m}{T}])\sum_{i|T}\frac{T}{i}\mu(i)i^2\\ &=\sum_{T=1}^nS([\frac{n}{T}])S([\frac{m}{T}])T\sum_{i|T}i\mu(i) \end{aligned}

$1$表示常数，即$1(i)=1$
$e$表示单位元，$e(i)=[i==1]$
$id$表示这个数本身，$id(i)=i$
$\mu,\varphi$就不说了。

• $\displaystyle (1*\mu)(n)=\sum_{d|n}\mu(d)=e$
证明并不难，$\mu$考虑的只有单个质因子，当某个质因子出现超过了$1$$\mu$的值就是$0$。那么我们假设$\displaystyle n=\prod_{i=1}^k p_i^{a_i}$。那么我们真正有用的值只有$2^k$个。当$k>0$的时候，显然$\mu=1$$\mu=-1$是一一对应的，因此和为$0$，当$k=0$的时候，$n=1$，此时结果为$1$。因此这两个的狄利克雷卷积就是单位元。

• $\displaystyle (\mu*id)(n)=\sum_{d|n}d\mu(\frac{n}{d})=\varphi(n)$
其实换种写法就很好证明了，$\displaystyle \sum_{d|n}\frac{n}{d}\mu(d)$
$\mu$函数又可以称为容斥系数，那么这鬼玩意的本质就是$n$减去其大于$1$的约数的倍数，也就是与$n$互质的数的个数，也就是$\varphi$

• $\displaystyle (1*\varphi)(n)=\sum_{d|n}\varphi(d)=id(n)=id$
可以用狄利克雷卷积的方法证明：$\displaystyle1*\varphi=1*\mu*id=e*id=id$

• $\displaystyle \sum_{i=1}^n [gcd(i,n)=1]i$
即小于$n$并且与$n$互质的数之和。除了莫比乌斯反演可以推之外，还有一个很好的推导方法。假设$x$$n$互质，那么$n-x$$n$互质，因此所有与$n$互质的数可以两两配对，且和为$n$。因此上述式子等于$\displaystyle \frac{n\varphi(n)}{2}$

## 杜教筛

$(g*f)(n)=\sum_{d|n}g(d)*f(\frac{n}{d})$

\begin{aligned} \sum_{i=1}^n (g*f)(i)&=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})\\ &=\sum_{d=1}^ng(d)\sum_{j=1}^{n/d}f(i)\\ &=\sum_{d=1}^ng(d)S([\frac{n}{d}]) \end{aligned}

\begin{aligned} g(1)S(n)&=\sum_{i=1}^ng(i)S([\frac{n}{i}])-\sum_{i=2}^ng(i)S([\frac{n}{i}])\\ &=\sum_{i=1}^n (f*g)(i)-\sum_{i=2}^n g(i)S(\frac{n}{i}) \end{aligned}

\begin{aligned} S(n)&=1-\sum_{i=2}^nS([\frac{n}{i}]) \end{aligned}

\begin{aligned} Ans&=\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\\ &=\sum_{d=1}^n d^3\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij[gcd(i,j)=1]\\ &=\sum_{d=1}^n d^3\sum_{i=1}^{n/d}\mu(i)*i^2*S^2([\frac{n}{id}])\\ &=\sum_{T=1}^n S^2([\frac{n}{T}])\sum_{d|T} d^3(\frac{T}{d})^2\mu(\frac{T}{d})\\ &=\sum_{T=1}^n S^2([\frac{n}{T}])(T^2\sum_{d|T}d\mu(\frac{T}{d})\\ &=\sum_{T=1}^n S^2([\frac{n}{T}])(T^2\varphi(T))\\ \end{aligned}

\begin{aligned} (f*g)(n)&=\sum_{d|n}f(d)g(\frac{n}{d})\\ &=\sum_{d|n}d^2\varphi(d)g(\frac{n}{d})\\ \end{aligned}

\begin{aligned} (f*g)(n)&=\sum_{d|n}d^2\varphi(d)g(\frac{n}{d})\\ &=n^2\sum_{d|n}\varphi(d)\\ &=n^3 \end{aligned}

## min_25筛

$min\_25$筛用于计算积性函数前缀和$\displaystyle S(n)=\sum_{i=1}^n f(i)$

• $f(x)$$x$为质数的时候要存在一个多项式的表示方法。
• $f(x^c)$$x$为质数的时候能够快速计算。

• 质数部分
$g(n,j)$表示的是，小于等于$n$的所有数$i$中，其最小质因子$p\gt P_j$或者$i$本身就是质数的所有的$i$$f(i)$之和。
等等，前面不是说了只有当$i$是质数的时候才能方便的计算$f(i)$吗？别急，这里我们假装所有数都是质数，带入到是质数的式子中一起计算，换句话说，这里就是一个构造过程，不需要管那么多啦QwQ。或者这样想，如果我们知道了$g(n,\infty)$，显然这个东西就是所有质数的和啊QaQ。接下来往下面看吧。
考虑一下这个东西怎么样才能转移呢，显然我们的转移从$j-1$转移到了$j$，那么就考虑$g(n,j-1)$$g(n,j)$多算了些什么。
多算的部分显然就是那些最小质因子恰好为$P_{j}$的数（别忘了上面那个是大于号），那么最小的一个最小质因子为$P_{j}$的数是谁呢？$P_{j}^2$。如果$P_j^2$$n$都要大了，那么我们什么也没有减掉，意味着$g(n,j)=g(n,j-1)$
否则的话，想想我们减掉了什么呢？我们先给所有数除掉一个$P_j$，那么如果剩下的部分的最小质因子还小于等于$P_j$的话那么显然不合法，也就是$\displaystyle g([\frac{n}{P_j}],j-1)$，但是这样子减多了，把小于$P_j$的质数的贡献给减掉了，这些质数与$P_j$构成的合数的最小质因子小于$P_j$，显然是早就被减掉了。那么我们重新把第$1$个到第$j-1$个质数的贡献加回来，也就是$g(P_j-1,j-1)$
然后我们要求的是$g$的和，我们减去的是$P_j$因子的贡献，而$f(x)$为积性函数，所以转移可以写成：

$g(n,j)=\begin{cases} g(n,j-1)&P_j^2>n\\ g(n,j-1)-f(P_j)(g([\frac{n}{P_j}],j-1)-g(P_j-1,j-1))&P_j^2\leq n \end{cases}$

$g$的初值也就是$g(n,0)$自己想想怎么计算吧QwQ。

• 合数部分
知道了质数的贡献，而目标函数又是积性函数，所以我们只需要用所有的质数拼出所有的合数就可以计算答案了。
$S(n,j)$表示所有最小质因子大于等于$P_j$的数$i$$f(i)$的和，注意这里和上面$g$的描述的区别。
那么计算$S$的值的时候显然是先把质数的贡献给算上，这一部分的贡献是$\displaystyle g(n,|P|)-\sum_{i=1}^{j-1}f(P_j)$，其中$P$是小于等于$\sqrt n$的质数集合。
接下来考虑合数的贡献，显然每个合数都存在一个最小质因子，那么我们来枚举这个因子，假设为$P_k,k\geq j$，枚举其幂，假设为$e$，那么考虑的就是所有包含了$P_k^e$的合数的贡献。
因为$f$是积性函数，所以把这里每次就考虑只包含$P_k^e$的贡献，首先是$\displaystyle S([\frac{n}{P_k^e}],k+1)$,因为这里并没有包含$1$的贡献，意味着$P_k^e$本身的贡献没有计算进来，所以要额外加进来。
所以转移就可以写成：

$S(n,j)=g(n,|P|)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k\geq j}^{|P|}\sum_{e}(f(P_k^e)S([\frac{n}{P_k^e}],k+1)+f(P_{k}^{e+1}))$

• 【LOJ#6053】简单的函数
发现这个东西是$f(p^k)=p\oplus k$，对于质数而言$f(p)=p-1$，当然$2$比较特殊$f(2)=p+1=3$，所以我们先把它当成$p-1$算，最后再加上$2$就好了。
前面也说了，因为在质数上涉及到的是一个多项式计算，所以本质上要求解的就是$f(p)=p^k$的形式，那么从这个式子就知道我么要求的是$k=0$$k=1$的情况。
$g(n,j)$表示$k=1$的情况。即$f(p)=p$，那么显然有转移：

$g(n,j)=\begin{cases} g(n,j-1)&P_j^2>n\\ g(n,j-1)-P_j(g([\frac{n}{P_j}],j-1)-g(P_j-1,j-1))&P_j^2\le n \end{cases}$

$h(n,j)$表示$k=0$的情况，即$f(p)=1$时的计算，那么有转移：

$h(n,j)=\begin{cases} h(n,j-1)&P_j^2>n\\ h(n,j-1)-(h([\frac{n}{P_j}],j-1)-h(P_j-1,j-1))&P_j^2\le n \end{cases}$

$S(n,j)=F(n)-\sum_{i=1}^{j-1}f(P_j)+\sum_{k\geq j}\sum_e(f(P_k^e)S([\frac{n}{P_k^e}],k+1)+f(P_k^{e+1}))$

• 【UOJ#188】sanrd
$\displaystyle \sum_{i=l}^r f(i)$的值，其中$f(i)$表示$i$的次大质因子。
看起来这里的这个函数与质数无关，并且也不是一个积性函数了，那么怎么办呢？
首先实际上我们要求的还是这个函数的前缀和，考虑一下$min\_25$筛最终求解答案的过程，每次我们枚举其当前拥有的最小质因子。那么，通过当前计算的$S(n,j)$$j$，我们可以很容易的知道当前数的上一个质因子是$P_{j-1}$。那么如果以$P_{j-1}$为质因数为贡献的话，显然就是当前剩下的数中质数的个数，这个可以提前用$min\_25$的前半部分筛出来。否则以更大的质数为贡献，那么枚举当前的最小质因子把它除掉接着递归处理即可，注意$P_k^c$的这个数的次大质因子为$P_k$，这里的贡献是额外算的。
代码直接戳UOJ记录
posted @ 2018-12-24 16:12  小蒟蒻yyb  阅读(2843)  评论(20编辑  收藏  举报