用一道题水过积性函数

来源:互联网 发布:电脑怎么看网络电视 编辑:程序博客网 时间:2024/05/14 22:06

这里写图片描述
就以这道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为质数,有

g(n)=τ(1)μ(1)1+τ(n)μ(n)n=211+1(1)n=2n

然后讨论有gcd(a,b)==1,>g(ab)=g(a)g(b),由于已经证明g(n)为积性函数。
最后只需要求解有n,为质数时的g(nk),就行了。
h(n)=μ(nd)nd
则对于h(nk)而言,只需要计算n1n0,因为对于
na,a=1>μ(n)=1
a=0>μ(n0=1)=1
a2>μ(na)=0

所以可以得到

g(na)=τ(na)μ(1)1+τ(na1)μ(n)n

g(na)=(a+1)11+a(1)n

g(na)=a(1p)+1

然后我们就通过公式在线性筛中实现就行了。

具体代码放置于另一篇blog(NOIP数论训练code)中。