背景
某只蒟蒻叫做LittlePrincess,有一天他学会了莫比乌斯反演,但是他做题总发现自己的反演和别人的暴力是一个世界复杂度!蒟蒻十分伤心,于是钻研dalao博客。dalao:剩下的就是个 n−−√ n 的除法分块了。这令蒟蒻十分蒙蔽,决心一探究竟——终于在万能的群友的帮助下….
例题:YY的GCD
我们经过GCD的历练发现我们将 ∑i∑j(gcd(i,j)==d) ∑ i ∑ j ( g c d ( i , j ) == d ) 设为f(n),而将 ∑i∑j(gcd(i,j)==d∗int)) ∑ i ∑ j ( g c d ( i , j ) == d ∗ i n t ) ) 设为F(n)
易得:
根据莫比乌斯反演:
我们将边界a缩为 [ad] [ a d ] 即我们要求 f(1) f ( 1 )
然后
可以化图验证一下 [ad] [ a d ] 中任意一个A和 [bd] [ b d ] 中任意一个B,A*d<=a,B*d<=b,且AB满足F(d):
得:
——
但是对于d不唯一时我们可以枚举质数p
令 T=ip T = i p
则有
然后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∗mT
n
T
∗
m
T
只需要
O(2(n−−√+m−−√))
O
(
2
(
n
+
m
)
)
时间复杂度,这个我显然不会证(写个暴力验证一下不就行了,非要严格数学证明干嘛)
然后我们处理前面那块(dalao博客里都证明过是调和级数的logn*素数个数的
nlogn
n
l
o
g
n
)的前缀和也可以不超时完成。
最后!我们耐心的写一下这些东西设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]
[
n
i
]
: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
[
n
i
]
==
2
时它的集合右边界是不是就是5 那么
[n[ni]]
[
n
[
n
i
]
]
就=5,哇好神奇?
Q:怎么证明?
A:写个暴力跑一天
那么这些dalao的代码就可以理解了从n开始枚举 j就是上个右边界 i-j的范围就是当前处理的集合!
哇!终于搞懂了,希望能给像我一样的蒟蒻带来帮助~