设数论函数 f。希望求解 S(n)=i=1∑nf(i)。
引理
假设存在数论函数 g,则根据上述定义:
i=1∑(f∗g)(i)=i=1∑g(i)S(⌊in⌋)
证明
i=1∑(f∗g)(i)=i=1∑nj=1∑⌊in⌋f(i)g(i)。
这一步我们把 f∗g 变换一下枚举顺序就可以了。接下来把 g(i) 提出来,里面的 f(i) 换掉就是,
i=1∑g(i)S(⌊in⌋)。
引理的应用
根据引理 g(1)S(n)=i=1∑(f∗g)(i)−i=2∑ng(i)S(⌊in⌋)。
如果 i=1∑(f∗g)(i) 知道了,可以用整除分块求出 i=2∑ng(i)S(⌊in⌋),那么 S(n)=g(1)i=1∑(f∗g)(i)−i=2∑ng(i)S(⌊in⌋) 就知道了。
现在就需要巧妙构造 g(i) 以使得 i=1∑(f∗g)(i) 可以快速计算。
例 1
求 S(n)=i=1∑nμ(i)。
注意到 ϵ=μ∗1。原因是 μ(n) 的隐性递归定义:d∣n∑μ(d)=ϵ(n)。
所以 1×S(n)=1−i=2∑nS(⌊in⌋)。
实现时需要注意较大的 n 会使得数组存不下,所以我们筛出当 n 较小时的 S(n),较大时再计算。
具体可以配合线性筛先求 O(n32),再求剩余的部分,这个时候总复杂度恰好是 O(n32) 的,取最小。