杜教筛

对于一般的欧拉线性筛,(O(n))确实很优秀,但有些毒瘤题,数据范围硬是达到了(1e8)以上

对于这种情况,就要用到杜教筛了

套路式:

有积性函数(h)(g),且(h=f*g),求 (sumlimits_{i=1}^n f(i))

(S(n)=sumlimits_{i=1}^n f(i))

(sumlimits_{i=1}^n h(i)=sumlimits_{i=1}^n sumlimits_{d|n} g(d)f(dfrac{i}{d}))

(~~~~~~~~~~~=sumlimits_{d=1}^n g(d) sumlimits_{i=1}^{leftlfloordfrac{n}{d} ight floor}f(i))

( herefore sumlimits_{i=1}^n h(i)=sumlimits_{d=1}^n g(d)S(leftlfloordfrac{n}{d} ight floor))

(~~~~~~~~~~~~~~=g(1)S(n)+sumlimits_{d=2}^n g(d)S(leftlfloordfrac{n}{d} ight floor))

( herefore g(1)S(n)=sumlimits_{i=1}^n h(i)-sumlimits_{d=2}^n g(d)S(leftlfloordfrac{n}{d} ight floor))

例题:

来看一个式子(S(n)=sumlimits_{i=1}^n mu(i)),则在这里面(f=mu)

(g(1)S(n)=sumlimits_{i=1}^n h(i)-sumlimits_{d=2}^n g(d)S(leftlfloordfrac{n}{d} ight floor))再看这个式子,我们找一个积性函数替换(g),使得原式计算更简单

(I(1)S(n)=sumlimits_{i=1}^n epsilon(i)-sumlimits_{d=2}^n I(d)S(leftlfloordfrac{n}{d} ight floor) Longrightarrow S(n)=1-sumlimits_{d=2}^n S(leftlfloordfrac{n}{d} ight floor))

整除分块就好了

毒瘤的出题人才不会让你这么简单看出来:(S(n)=sumlimits_{i=1}^nicdot varphi(i))

一般这个时候带进卷积会更易观察:(sumlimits_{d|n}(dcdotvarphi(d))cdot g(frac{n}{d}))

(g)换成(id)根据欧拉函数的性质就容易消掉了

[sum_{d|n}(dcdotvarphi(d))cdot frac{n}{d}=sum_{d|n}ncdotvarphi(d)\ o=nsum_{d|n}varphi(d)=n^2 ]

最终变式:$$S(n)=sum_{i=1}^{n}i^2-sum_{d=2}^{n}dcdot S(lfloorfrac{n}{d} floor)$$

原文地址:https://www.cnblogs.com/y2823774827y/p/10219701.html