Orz OO0OOO00O0OOO0O00OOO0OOhtml
前置知识
狄利克雷卷积函数
杜教筛
套路
杜教筛是用来求一类积性函数的前缀和
它经过各类转化,最终利用数论分块的思想来下降复杂度
假设咱们如今要求$S(n) = \sum_{i = 1}^n f(i)$,$f(i)$为积性函数,$n \leqslant 10^{12}$
直接求确定是很差求的,不过如今假设有另外一个积性函数$g$
咱们来求它们狄利克雷卷积的前缀和
$$\sum_{i = 1}^n (g * f) = \sum_{i = 1}^n \sum_{d \mid i} g(d) f(\frac{i}{d})$$
$$= \sum_{d = 1}^n g(d) \sum_{d|i} f(\frac{i}{d})$$
$$= \sum_{d = 1}^n g(d) \sum_{i = 1}^{\frac{n}{d}}f(i)$$
$$= \sum_{d = 1}^n g(d) S(\frac{n}{d})$$
而后就化不动了,不过咱们发现咱们化出了$\frac{n}{d}$!excited
可是$S(n)$怎么求呢?
容斥一下
$$g(1)S(n) = \sum_{d = 1}^n g(d)S(\frac{n}{d}) - \sum_{d = 2}^n g(d)S(\frac{n}{d})$$
前半部分是狄利克雷卷积的前缀和的形式
后半部分能够数论分块。这样看起来就好搞多了
如今咱们的问题是,如何选择$g$才能使得上面这个式子好算
这个就要因状况而定了
下面煮几个典型栗子
$\mu$函数
定理:$\sum_{d \mid n} \mu(d) = [n = 1]$post
那么咱们若是选择$g = 1(i)$,学习
这样对于每一项,$(g * f)(i) = \sum_{d \ | i} 1 * \mu(\frac{i}{d}) = e$spa
其中$e$为原函数,$e = [n = 1]$.net
所以$g$与$\mu$的卷积的前缀和确定为$1$code
上面的式子变为htm
$S(n) = 1 - \sum_{d = 2}^n S(\frac{n}{d})$blog
后半部分直接数论分块就好ci
$\varphi$函数
定理:$\sum_{d \mid n}\varphi(d) = n$
咱们的$g$仍是选$1$作卷积
那么$(g * f)(i) = \sum_{d \ | i} 1 \varphi(\frac{i}{d}) = i$
所以$\sum_{i = 1}^n g * f = \frac{n (n + 1)}{2}$
咱们要求得式子变为
$$S(n) = \frac{n * (n + 1)}{2} - \sum_{d = 2}^n S(\frac{n}{i})$$
前半部分$O(1)$算,后半部分数论分块
题目
目前没有作多少题目,并且个人杜教筛是分两波学的,因此码风差别可能比较大qwq。
洛谷P4213 Sum
BZOJ4805
BZOJ4916
若是须要真·杜教筛题目的话能够去看糖教的博客
https://blog.csdn.net/skywalkert/article/details/50500009
参考资料
杜教筛——省选前的学习1
我也不知道什么是"莫比乌斯反演"和"杜教筛"
浅谈一类积性函数的前缀和