用一道题水过积性函数

这里写图片描述
就以这道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) 而言,只需要计算 n1 n0 ,因为对于

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)中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值