对于一般的欧拉线性筛,(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)根据欧拉函数的性质就容易消掉了
最终变式:$$S(n)=sum_{i=1}^{n}i^2-sum_{d=2}^{n}dcdot S(lfloorfrac{n}{d} floor)$$