杜教筛
对于一般的欧拉线性筛,\(O(n)\)确实很优秀,但有些毒瘤题,数据范围硬是达到了\(1e8\)以上
对于这种情况,就要用到杜教筛了
套路式:
有积性函数\(h\)、\(g\),且\(h=f*g\),求 \(\sum\limits_{i=1}^n f(i)\)
设\(S(n)=\sum\limits_{i=1}^n f(i)\)
\(\sum\limits_{i=1}^n h(i)=\sum\limits_{i=1}^n \sum\limits_{d|n} g(d)f(\dfrac{i}{d})\)
\(~~~~~~~~~~~=\sum\limits_{d=1}^n g(d) \sum\limits_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}f(i)\)
\(\therefore \sum\limits_{i=1}^n h(i)=\sum\limits_{d=1}^n g(d)S(\left\lfloor\dfrac{n}{d}\right\rfloor)\)
\(~~~~~~~~~~~~~~=g(1)S(n)+\sum\limits_{d=2}^n g(d)S(\left\lfloor\dfrac{n}{d}\right\rfloor)\)
\(\therefore g(1)S(n)=\sum\limits_{i=1}^n h(i)-\sum\limits_{d=2}^n g(d)S(\left\lfloor\dfrac{n}{d}\right\rfloor)\)
例题:
来看一个式子\(S(n)=\sum\limits_{i=1}^n \mu(i)\),则在这里面\(f=\mu\)
\(g(1)S(n)=\sum\limits_{i=1}^n h(i)-\sum\limits_{d=2}^n g(d)S(\left\lfloor\dfrac{n}{d}\right\rfloor)\)再看这个式子,我们找一个积性函数替换\(g\),使得原式计算更简单
\(I(1)S(n)=\sum\limits_{i=1}^n \epsilon(i)-\sum\limits_{d=2}^n I(d)S(\left\lfloor\dfrac{n}{d}\right\rfloor) \Longrightarrow S(n)=1-\sum\limits_{d=2}^n S(\left\lfloor\dfrac{n}{d}\right\rfloor)\)
整除分块就好了
毒瘤的出题人才不会让你这么简单看出来:\(S(n)=\sum\limits_{i=1}^ni\cdot \varphi(i)\)
一般这个时候带进卷积会更易观察:\(\sum\limits_{d|n}(d\cdot\varphi(d))\cdot g(\frac{n}{d})\)
把\(g\)换成\(id\)根据欧拉函数的性质就容易消掉了
最终变式:$$S(n)=\sum_{i=1}{n}i2-\sum_{d=2}^{n}d\cdot S(\lfloor\frac{n}{d}\rfloor)$$