就以这道SB题为例,我们来讨论一下实际题目中解决积性函数的简单问题(?).
blog主蒟蒻,如果要找数论神犇请%%%idy002,或者数论大佬%%%%%Doggu。
所以就不给数学上的证明了,请自学(?死记莫比乌斯反演公式)。
基本的莫比乌斯反演:
因为
开始:
先考虑数据范围, 107 ,很明显,线性筛。
首先一看这个函数就有 φμσ0(就是τ) 等函数(也可以考虑有单位函数 id(n)=n 与幂函数 idk(n)=nk ),所以可以使用???推公式。
对于
f(n)
,有两个大部分合成。
一个就是
(∑d|nφ(d))m
,如果你的积性函数还过得去,比blog好的话,你可以看出这玩意儿就是
nm
,为什么呢?因为
所以左边就变成了 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 ,因为对于
所以可以得到
然后我们就通过公式在线性筛中实现就行了。
具体代码放置于另一篇blog(NOIP数论训练code)中。