ORZ唐老师
唐老师的那篇积性函数前缀和666呀。摩拜嘻嘻。
来一篇学后感。
记任意算术函数
f
的前缀和为:
Sf(n)=∑i=1nf(i)
记:
C(n)=∑d|nA(d)B(nd)
注:
上式子形如 C(n)=∑ab=nA(a)B(b)
称这一卷积形式为狄利克雷卷积
记为 A∗B=C
狄利克雷卷积满足
A∗(B∗D)=(A∗B)∗D
A∗B=B∗A
则有:
SA(n)=SC(n)−∑i=2B(i)SA(⌊ni⌋)
SB(n)=SC(n)−∑i=2A(i)SB(⌊ni⌋)
证明:
C(n)=∑d|nA(d)B(nd)得:A(n)=C(n)−∑d|n,d≠nA(d)B(nd)
SA(n)=SC(n)−∑i=1n∑d|i,d≠iA(d)B(id)=SC(n)−∑i=1n∑d|iA(d)B(id)−SA(n)
对于
∑i=1n∑d|iA(d)B(id)=∑i=1n∑d|iB(d)A(id)=∑d=1nB(d)∑d|iA(id)=∑d=1nB(d)SA(⌊nd⌋)
所以有:
SA(n)=SC(n)−∑i=2B(i)SA(⌊ni⌋)
同理有:
SB(n)=SC(n)−∑i=2A(i)SB(⌊ni⌋)
对上式变形:
SA(n)=SC(n)−∑L=1mSA(L)∑i=⌊nL+1⌋+1⌊nL⌋B(i)−∑i=2⌊nm+1⌋B(i)SA(⌊ni⌋)=SC(n)−∑L=1mSA(L)(SB(⌊nL⌋)−SB(⌊nL+1⌋))−∑i=2⌊nm+1⌋B(i)SA(⌊ni⌋)
通常我们令 m=⌊n√⌋
对于不大于
m
的i ,通过预处理可以直接得到。
对低有一个很重要的性质
⌊⌊na⌋b⌋=⌊nab⌋,其中所有数均为正整数
证明:
⌊⌊na⌋b⌋=⌊n−n mod aab⌋=⌊(n−n mod a)−(n−n mod a) mod (ab)ab⌋=⌊nab⌋+⌊−(n mod a)−(n mod a) mod (ab)ab⌋=⌊nab⌋
这也就是说 ,我们按照:
SA(n)=SC(n)−∑L=1mSA(L)(SB(⌊nL⌋)−SB(⌊nL+1⌋))−∑i=2⌊nm+1⌋B(i)SA(⌊ni⌋)
计算 SA(n) 时。我们最终仅仅只是计算了 i∈[1,m] 所有的 SA(⌊ni⌋)
故。我们可以从小到大递推得到最终的 SA(n)
计算复杂度于计算 SC,B,SB 有关。故具体情况具体分析
提供一组结论
对于计算: ∑⌊n√⌋i=1O((ni)k)
当 k>1 时:
∑i=1⌊n√⌋O((ni)k)=O(nk)
当 k=1 时:
∑i=1⌊n√⌋O((ni)k)=O(nlog n√)
当 0≤k<1 时:
∑i=1⌊n√⌋O((ni)k)=O(nk+12)
有了上面的工具对于很多函数前缀和的计算久方便的多了
例如计算 Sφ
我们有: φ∗I=N
其中: I(n)=1,N(n)=n
直接套用公式:
SA(n)=SC(n)−∑L=1mSA(L)(SB(⌊nL⌋)−SB(⌊nL+1⌋))−∑i=2⌊nm+1⌋B(i)SA(⌊ni⌋)
得到:
Sφ(n)=n(n+1)2−∑L=1mSφ(L)(⌊nL⌋−⌊nL+1⌋)−∑i=2⌊nm+1⌋Sφ(⌊ni⌋)
应用上式复杂度分析, k=12 :
T(n)=∑i=1⌊n√⌋O(ni−−√)=O(n12+12)=O(n34)
当 m=n23,k=13
T(n)=O(n23)
并非
m
越大越好。因为有时候。构造函数的前缀和未必O(1) 可以得到。此时要恰当的选取
m
下面是TLS的博客地址(不过百度第一个就是啦。。真的太火爆了)
http://blog.youkuaiyun.com/skywalkert/article/details/50500009