关于莫比乌斯反演与除法枚举

本文通过一道例题详细解析了如何运用莫比乌斯反演解决具体问题,并介绍了除法分块优化技巧,帮助读者理解反演原理及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

某只蒟蒻叫做LittlePrincess,有一天他学会了莫比乌斯反演,但是他做题总发现自己的反演和别人的暴力是一个世界复杂度!蒟蒻十分伤心,于是钻研dalao博客。dalao:剩下的就是个nn的除法分块了。这令蒟蒻十分蒙蔽,决心一探究竟——终于在万能的群友的帮助下….

例题:YY的GCD

我们经过GCD的历练发现我们将ij(gcd(i,j)==d)∑i∑j(gcd(i,j)==d)设为f(n),而将ij(gcd(i,j)==dint))∑i∑j(gcd(i,j)==d∗int))设为F(n)

易得:

F(n)=n|df(d)F(n)=∑n|df(d)
根据莫比乌斯反演:

f(n)=n|dμ(dn)F(d)f(n)=∑n|dμ(dn)F(d)

我们将边界a缩为[ad][ad]即我们要求f(1)f(1)
然后

f(1)=i=1μ(d)F(d)f(1)=∑i=1μ(d)F(d)
可以化图验证一下[ad][ad]中任意一个A和[bd][bd]中任意一个B,A*d<=a,B*d<=b,且AB满足F(d):
得:

F(d)=adbdF(d)=ad∗bd
——

f(1)=i=1μ(i)aibif(1)=∑i=1μ(i)ai∗bi

但是对于d不唯一时我们可以枚举质数p

ans=pi=1μinipmipans=∑p∑i=1μ(i)nip∗mip
T=ipT=ip

则有

ans=p|Tμ(Tp)T=1nTmTans=∑p|Tμ(Tp)∑T=1nT∗mT

然后dalao们就摆出一行代码
for(int i=1,j;i<=n;i=j+1)
    {
        j=min(n/(n/i),m/(m/i));
        ans+=(LL)(n/i)*(LL)(m/i)*(LL)(sum[j]-sum[i-1]); 
    }

像我这种蒟蒻肯定看不懂啦!然后我就找了很多博客和问dalao最终!

详解除法枚举

假设我们枚举nTmTnT∗mT只需要O(2(n+m)O(2(n+m))时间复杂度,这个我显然不会证(写个暴力验证一下不就行了,非要严格数学证明干嘛)
然后我们处理前面那块(dalao博客里都证明过是调和级数的logn*素数个数的nlognnlogn)的前缀和也可以不超时完成。
最后!我们耐心的写一下这些东西设n==10
i : 1 2 3 4 5 6 7 8 9 10
μ: 1 -1 -1 0 -1 1 -1 0 0 1
sum: 略
[ni][ni]:10 5 3 2 2 1 1 1 1 1
我们能枚举出来的就是这最后一行所以我们要对{1},{2},{3},{4,5},{6,7,8,9,10}分块处理
然后我们又有一个神奇的性质:并且对于i,⌊n⌊ni⌋⌋是i被n除并下取整取值相同的一段区间的右端点
这是啥意思呢?
我举个 栗子
[ni]==2[ni]==2时它的集合右边界是不是就是5 那么[n[ni]][n[ni]]就=5,哇好神奇?
Q:怎么证明?
A:写个暴力跑一天
那么这些dalao的代码就可以理解了从n开始枚举 j就是上个右边界 i-j的范围就是当前处理的集合!
哇!终于搞懂了,希望能给像我一样的蒟蒻带来帮助~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值