前言
杜教筛是杜瑜皓引入国内的一种非线性复杂度内求积性函数前缀和的算法。
对于前 (n^{2/3}) 的范围线性筛,其余进行递归处理。
时间复杂度 (O(n^{2/3}))
前置知识
- 狄利克雷卷积
- 常见的积性函数
实现
假设我们要求 (sum(n)=sumlimits_{i=1}^{n} f(i)) ,不妨构造 (g) 使得 (h=f*g) 。
则
[sumlimits_{i=1}^{n}h(i)=sumlimits_{i=1}^{n} sumlimits_{j|i} g(j)f(frac{i}{j})
]
[=sumlimits_{j=1}^{n} g(j)sumlimits_{i=1}^{lfloor frac{n}{j}
floor} f(i)
]
[=sumlimits_{j=1}^{n} g(j) sum(lfloor frac{n}{j}
floor)
]
因此
[g(1)sum(n)=sumlimits_{i=1}^{n} h(i) - sumlimits_{j=2}^{n} g(j)sum(lfloor frac{n}{j}
floor)
]
直接整除分块,递归处理即可。
注意这里的 (h) 和 (g) 要尽可能构造的简单,以方便计算。
复杂度证明
设 (S(n)) 的算法复杂度为 (T(n)) ,则有
[T(n)=O(sqrt{n})+sumlimits_{i=2}^{sqrt{n}} (T(i)+T(frac{n}{i}))
]
往下迭代一层,注意到再往下就是高阶小量,所以可忽略不计。
[T(n)=O(sqrt{n})+sumlimits_{i=2}^{sqrt{n}} (O(sqrt{i})+O(sqrt{frac{n}{i}})
]
[= O(sqrt{n}) + sumlimits_{i=2}^{sqrt{n}} O(sqrt{sqrt{n}})
]
[= O(n^{1/2}) + O(n^{3/4})
]
[= O(n^{3/4})
]
考虑预处理前 (k) 项的前缀和,则
[T(n)=sumlimits_{i=2}^{frac{n}{k}} O(sqrt{frac{n}{i}})
]
[=O(frac{n}{k} sqrt{k})=O(frac{n}{sqrt{k}})
]
平衡一下预处理和计算函数,则 (frac{n}{sqrt{k}} = k) ,即 (k^{frac{3}{2}}=n) 。
令 (k=n^{frac{2}{3}}) ,此时预处理降至 (O(n^{frac{2}{3}})) ,计算函数降至 (O(n^{frac{2}{3}})) 。
因此总时间复杂度 (O(n^{frac{2}{3}})) 。
examples
- (sumlimits_{i=1}^{n} varphi(n))
令 (g=I) ,则有 (h=varphi * I = id) ,因此
[sum(n)=frac{n(n+1)}{2}-sumlimits_{j=2}^{n} sum(lfloor frac{n}{j}
floor)
]
- (sumlimits_{i=1}^{n} mu(n))
令 (g=I) ,则有 (h=mu * I = ϵ) ,因此
[sum(n)=1-sumlimits_{j=2}^{n} sum(lfloor frac{n}{j}
floor)
]
- (sumlimits_{i=1}^{n} n imes varphi(n))
令 (g=ID) ,则有 (h=(ID imes varphi)*ID = ID^2) ,因此
[sum(n)=frac{n(n+1)(2n+1)}{6} -sumlimits_{j=2}^{n} sum(lfloor frac{n}{j}
floor)
]
四个小结论
当(mu(n)=0) 时,下列四个柿子都等于 (0) ,否则结果如下
(sum_{d|n}dmu(d)varphi(frac{n}{d})=mu(n))
(sum_{d|n}frac{n}{d}mu(d)varphi(d)=1)
(sum_{d|n}frac{dmu(frac{n}{d})}{varphi(d)}=frac{1}{varphi(n)})
(sum_{d|n}frac{varphi(d)mu(frac{n}{d})}{d}=frac{mu(n)}{n})
读者自证不难