就以这道SB题为例,我们来讨论一下实际题目中解决积性函数的简单问题(?).
blog主蒟蒻,如果要找数论神犇请%%%idy002,或者数论大佬%%%%%Doggu。
所以就不给数学上的证明了,请自学(?死记莫比乌斯反演公式)。
基本的莫比乌斯反演:
f(n)=∑d|ng(d)
−>g(n)=∑d|nf(n)μ(⌊nd⌋)
=∑d|nf(⌊nd⌋)μ(d)
=∑(∑k|ndg(k))μ(d)
=∑k|ng(k)[∑d|nkμ(d)]
因为
∑d|nkμ(d)=e(nk),e(n)=[n==1]
所以证毕。 开始:
先考虑数据范围,107,很明显,线性筛。
首先一看这个函数就有φμσ0(就是τ)等函数(也可以考虑有单位函数id(n)=n与幂函数 idk(n)=nk),所以可以使用???推公式。
对于f(n),有两个大部分合成。
一个就是(∑d|nφ(d))m,如果你的积性函数还过得去,比blog好的话,你可以看出这玩意儿就是nm,为什么呢?因为
∑d|nφ(d)=n
可以用莫比乌斯反演证明,同类(∑d|ndμ(⌊nd⌋)=φ(n)). 所以左边就变成了nm,完美,继续。
对于∑d|nτ(d)μ(⌊nd⌋)⌊nd⌋。
对于id(n)=n,这类的函数就是单位函数,是积性函数。那么⌊nd⌋就解决了。
对于μτ就不解释了,肯定是积性函数。
那么一条总要的结论,积性函数*积性函数得到的函数也一定是积性函数。
令g(n)=∑d|nτ(d)μ(⌊nd⌋)⌊nd⌋,那么g(n)也一定是积性函数。
所以我们需要转换公式后在线性筛中筛出g(n),再乘上nm就行了。
还是先解决简单的nm,这玩意儿其实可以看做一个幂函数idk(n)=nk,它也是积性函数,所以也可以在线性筛中单独处理,最后在与另一个乘起来就行了,放在一起处理太累了。。。
关键是处理右边的一坨∑d|nτ(d)μ(⌊nd⌋)⌊nd⌋,推一推公式。
对于线性筛中的操作,若有n为质数,有
然后讨论有gcd(a,b)==1,−>g(ab)=g(a)∗g(b),由于已经证明g(n)为积性函数。
最后只需要求解有n,为质数时的
令h(n)=μ(⌊nd⌋)⌊nd⌋
则对于h(nk)而言,只需要计算n1与n0,因为对于
na,a=1−>μ(n)=−1
a=0−>μ(n0=1)=1
a≥2−>μ(na)=0
所以可以得到
g(na)=τ(na)μ(1)∗1+τ(na−1)μ(n)∗n
g(na)=(a+1)∗1∗1+a∗(−1)∗n
g(na)=a(1−p)+1
然后我们就通过公式在线性筛中实现就行了。
具体代码放置于另一篇blog(NOIP数论训练code)中。