背景
某只蒟蒻叫做LittlePrincess,有一天他学会了莫比乌斯反演,但是他做题总发现自己的反演和别人的暴力是一个世界复杂度!蒟蒻十分伤心,于是钻研dalao博客。dalao:剩下的就是个n−−√n的除法分块了。这令蒟蒻十分蒙蔽,决心一探究竟——终于在万能的群友的帮助下….
例题:YY的GCD
我们经过GCD的历练发现我们将∑i∑j(gcd(i,j)==d)∑i∑j(gcd(i,j)==d)设为f(n),而将∑i∑j(gcd(i,j)==d∗int))∑i∑j(gcd(i,j)==d∗int))设为F(n)
易得:
根据莫比乌斯反演:
我们将边界a缩为[ad][ad]即我们要求f(1)f(1)
然后
可以化图验证一下[ad][ad]中任意一个A和[bd][bd]中任意一个B,A*d<=a,B*d<=b,且AB满足F(d):
得:
——
但是对于d不唯一时我们可以枚举质数p
令T=ipT=ip
则有
然后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最终!
详解除法枚举
假设我们枚举nT∗mTnT∗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的范围就是当前处理的集合!
哇!终于搞懂了,希望能给像我一样的蒟蒻带来帮助~