什么是杜教筛?
用来在非线性时间内求积性函数前缀和的方法
已知(f(i))为积性函数,设
[S(n)=sumlimits_{i=1}^{n}f(i)
]
我们若要低于线性的复杂度求出(S(n)),该如何做?
设
[h=f*g
]
可以得出
[sumlimits_{i=1}^{n}h(i)=sumlimits_{i=1}^{n}(f*g)(i)
]
[=sumlimits_{i=1}^{n}sumlimits_{d|i}f(d)g(frac{i}{d})
]
[=sumlimits_{d=1}^{n}g(d)sumlimits_{i=1}^{lfloorfrac{n}{d}
floor}f(i)
]
[=sumlimits_{d=1}^{n}g(d)S(lfloorfrac{n}{d}
floor)
]
我们发现,其中含有(S(n))的项(g(1)S(n))等于
[sumlimits_{i=1}^{n}h(i)-sumlimits_{i=2}^{n}g(i)S(lfloorfrac{n}{i}
floor)
]
如果我们找到一个可以快速求前缀和的(h)和(g)函数,那么我们就可以递归求解(S)的值了
如果我们预先处理出小于等于(n^{frac{2}{3}})的(S)的值,总复杂度就是(O(n^{frac{2}{3}})) (我也不会证
求:
[ans1=sumlimits_{i=1}^{n}phi(i)
]
[ans2=sumlimits_{i=1}^{n}mu(i)
]
我们需要一些前置姿势:
[mu*1=ϵ
]
以及
[phi*1=n
]
(emmmmmm),然后好像套式子就行了,到此结束。