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
<script type="math/tex" id="MathJax-Element-47">m</script>
下面是TLS的博客地址(不过百度第一个就是啦。。真的太火爆了)
http://blog.csdn.net/skywalkert/article/details/50500009