一、前言
寒假康复训练并承接期末考试前内容
二、讲解
1.前置知识:积性函数
- 常见的积性函数:(varphi,mu,sigma,d)
- 常见的完全积性函数:(epsilon,I,id)
其中 (epsilon(n)=[n=1],I(n)=1,id(n)=n)
2.杜教筛
我们要求积性函数 (f) 的前缀和 (S(n)=sum_{i=1}^nf(i))
我们需要另一个积性函数 (g) 与狄利克雷卷积 ((f*g)(n)=sum_{d|n}f(d)*g(frac{n}{d}))
我们令 (h(n)=sum_{i=1}^nsum_{d|i}f(d)*g(frac{i}{d}))
(h(n)=sum_{d=1}^nf(d)sum_{d|i}g(frac{i}{d}))
显然可以互换
(h(n)=sum_{d=1}^ng(d)sum_{d|i}f(frac{i}{d}))
改写一下
(h(n)=sum_{d=1}^ng(d)sum_{i=1}^{lfloorfrac{n}{d} floor}f(i)=sum_{d=1}^ng(d)S(lfloorfrac{n}{d} floor))
裂开它!
(h(n)=g(1)S(n)+sum_{d=2}^ng(d)S(lfloorfrac{n}{d} floor))
(S(n)=frac{h(n)-sum_{d=2}^ng(d)S(lfloorfrac{n}{d} floor)}{g(1)})
所以我们只需要找到一个合适的函数 (g) ,使得可以快速算出上式的分子即可
一般可以用到数论分块
上式所有的 (S) 都可以用这个方法算出来
所以我们可以预处理一部分,递归处理一部分,加上记忆化,可以用到 ( exttt{hash}) 或者 ( exttt{map})
其中预处理的部分取 (n^{2/3}) 时最优,但实际上我们开不了这么大的空间,根据实际情况适当调整即可
这就是杜教筛,时间复杂度可以做到 (O(n^{frac{2}{3}})),暂时不会证明
三、例题
1.求 (mu) 的前缀和
求 (S(n)=sum_{i=1}^nmu(i))
我们不难想到这个公式:
([n=1]=sum_{d|n}mu(i))
化!我们令 (h(n)=[n=1],g(n)=1),再套用上面的公式!
(S(n)=[n=1]-sum_{d=2}^nS(lfloorfrac{n}{d} floor))
后半部分显然可以数论分块
2.求 (varphi) 的前缀和
求 (S(n)=sum_{i=1}^n varphi(i))
根据 (id(n)=sum_{d|n}varphi(d))
(S(n)=frac{(n+1)*n}{2}-sum_{d=2}^nS(lfloorfrac{n}{d} floor))
后半部分依然可以数论分块