杜教筛

一、前言

寒假康复训练并承接期末考试前内容

二、讲解

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))

后半部分依然可以数论分块

四、习题

例一&例二(洛谷)

神犇和蒟蒻(DarkBZOJ)

简单的数学题(洛谷)

原文地址:https://www.cnblogs.com/PPLPPL/p/14352023.html