杜教筛

 

从省选开始挖的坑现在补..


很好的参考资料..

糖老师的blog

吉丽的blog


填坑计划

这是由杜老师引进中国oi的算法.. 用低于线性时间来算积性函数的前缀和

一般就是找另外一个积性函数卷积起来变成一个更方便计算前缀和的东西,以降低数据规模从而达到降低时间复杂度

比如说要计算$\sum_{i=1}^n\mu(i)$,由于$1*\mu=\epsilon$,也就是先计算$\epsilon$的前缀和

$$\sum_{i=1}^n\epsilon(i)=\sum_{i=1}^n\sum_{d|n}\mu(d)$$

设$i'd=i$

$$\sum_{i=1}^n\sum_{d|n}\mu(d)=\sum_{i'=1}^n\sum_{d=1}^{\lfloor\frac{n}{i'}\rfloor}\mu(d)$$

把$i'=1$的分离出来就是要求的$S(n)$

$$\sum_{i'=1}^n\sum_{d=1}^{\lfloor\frac{n}{i'}\rfloor}\mu(d)=\sum_{d=1}^{n}\mu(d)+\sum_{i'=2}^n\sum_{d=1}^{\lfloor\frac{n}{i'}\rfloor}\mu(d)$$

后面的一段就是缩小规模的求前缀和了.. 递归即可,要记忆化

这样子的复杂度是$O(n^{\frac{3}{4}})$,如果线性筛前面$n^{\frac{2}{3}}$就可以做到$O(n^{\frac{2}{3}})$

 

按照吉丽说的一般有这样两种形式:

1)求$S(n)=\sum\limits_{i=1}^n(f\cdot g)(i)$,且$g(i)$为完全积性函数

$$\sum_{i=1}^n[(f*1)\cdot g](i)=\sum_{i=1}^ng(i)S(\lfloor\dfrac{n}{i}\rfloor)$$

2)求$S(n)=\sum\limits_{i=1}^n(f*g)(i)$

$$\sum_{i=1}^ng(i)\sum_{ij\leq n}(f*1)(j)=\sum_{i=1}^nS(\lfloor\dfrac{n}{i}\rfloor)$$


 

糖老师的题目..

51Nod 1244 - 莫比乌斯函数之和

利用$1*\mu =\epsilon$

51Nod 1239 - 欧拉函数之和

利用$1*\varphi = n$

BZOJ 3944 - Sum

上两题的综合,貌似要一起算不然会t

HDU 5608 - function

题目就是解法

51Nod 1238 - 最小公倍数之和 V3

吉丽的例题1

51Nod 1237 - 最大公约数之和 V3

推出的柿子是$$\sum_{d}\varphi(d)(\lfloor\dfrac{n}{d}\rfloor)^2$$

然后就是算$\varphi$的前缀和了

51Nod 1227 - 平均最小公倍数

就是算$A(n)=\sum\limits_{i=1}^n\frac{i}{(n,i)}$的前缀和

$$A(n)=\sum_{i=1}^n\frac{i}{(n,i)}=\sum_{i=1}^n\sum_{d|n}\dfrac{i}{d}[(i,n)=d]$$

设$i'd=i$

$$=\sum_{d|n}\sum_{i=1}^{n/d}i[(i,\dfrac{n}{d})=1]$$

后面的柿子就是和$n$互质的数的和

之前推过,结果就是

$$=\dfrac{1}{2}(1+\sum_{d|n}d\varphi(d))$$

求$A(n)$的前缀和就套上述第一种情况就行了

SPOJ DIVCNT2 - Counting Divisors (square)

在rzz的论文里有讲

下图转自qzqzgfy的blog

根据容斥原理可得

$$\sum_{i=1}^n\mu^2(i)=\sum_{i=1}^{\sqrt{n}}\mu(i)\lfloor\dfrac{n}{i^2}\rfloor$$

可以在$\sqrt{n}$求出,再预处理出$\sigma_0$的前缀和可以使复杂度降至$O(n^{\frac{2}{3}})$

51Nod 1222 - 最小公倍数计数(复杂度分析)

待填

BZOJ 4176 - Lucas的数论

吉丽的例2

要用到这个东西,$f(n)$表示$n$的约数个数

$$f(ij)=\sum_{p|i}\sum_{q|j}[(p,q)=1]$$

其中$\dfrac{i}{p}q$是$ij$的一个约数

51Nod 1220 - 约数之和

吉丽的例3

类似上面的解法,最后发现后面两个柿子其实是一个柿子就很好算了

51Nod 1584 - 加权约数和

待填

BZOJ 3512 - DZY Loves Math IV

$n$较小就一个个算,设$S(n,m)=\sum\limits_{i=1}^m\varphi(ni)$

那么如果$\mu(n)=0$,可以提出一个最大的$k$使得$|\mu(k)|=1$,可得$S(n,m)=\dfrac{n}{k}S(k,m)$

然后要推出$S(n,m)=\sum\limits_{d|n}\varphi(\dfrac{n}{d})S(d,\lfloor\dfrac{m}{d}\rfloor)$

有下面两种方法

chloe-fan的blog

xyz的blog

好吧貌似xyz没讲什么(逃)..

就是考虑$d$每一个质因数$p$的贡献

最后为$(p-1)\cdot p^a=(p-1)\cdot ((p-1)+1)\cdot p^{a-1}$

那么那个柿子就是把$(p-1)$和$1$分开来算

然后就是往下推没问题了

要map记忆化一下..

 

ZOJ 5340 - The Sum of Unitary Totient常规积性函数求和,数据组数较多,只可分段打表)
SPOJ DIVCNT3 - Counting Divisors (cube)常规积性函数求和,注意代码长度限制,不可打表)
51Nod 1575 - Gcd and Lcm常规积性函数求和,可分段打表)
51Nod 1847 - 奇怪的数学题(非常规积性函数求和,综合题,可分段打表)

没做的以后再说吧..

posted @ 2017-09-19 21:33  Ra1nbow  阅读(703)  评论(0编辑  收藏  举报