莫比乌斯反演
基础公式:F(n) = ∑(d|n)f(d) <=> f(n) = ∑(d|n)u[d]F[n/d]
u[i] = 0表示i有平方因子
u[i] = -1表示i无平方因子且唯一分解后有奇数个质因子
u[i] = 1表示i无平方因子且唯一分解后有偶数个质因子
u是积性函数。莫比乌斯反演在求解很多需要容斥的数论问题上非常方便
下面给出各种题型:
1. n个数中任意取出k个,求k个数最大公约数为1的组数NOJ 2079 (k == 2),POJ 3904 (k == 4)
这类题的做法是用总的情况容斥不满足的情况,C(n,k) - C(gcd只含奇数个质数的个数,k) + C(gcd只含偶数个质数的个数,k),前面的符号就是莫比乌斯函数,gcd为i的直接nlogn预处理
2. 求无平方因子数,UESTC 618 这个求的是[1, n]中无平方因子数的个数,直接枚举平方因子用莫比乌斯函数容斥即可(总个数-因子有4的个数-因子有9的个数+因子有36的个数...) BZOJ 2440 这题要求的是第k个无平方因子数,考虑到数据范围,还需要二分查找
3. 有一大类问题形如:给出a,b,(可能有c)的范围,然后求gcd(a, b) = k的(a, b)的对数,这里的k为带有某种特征的数,比如1或素数等等,这类题通常会用到分块求和优化,这篇博客就不解释了,有时(a,b)和(b,a)是一种情况,有时不是一种情况,要看清题目,下面对于这一大类问题再继续细分
1) SPOJ VLATTICE Visible Lattice Points 立方体,从原点能看到多少点,首先三个数轴上有三点,其次三个平面上算一下(gcd(a, b) = 1, gcd(a, c) = 1 , gcd(d, c) = 1的组数),最后立方体中的点算一下(gcd (a,b,c) = 1的组数),因为是立方题a=b=c=n算的时候用莫比乌斯函数容斥,思想类似题型1
ZOJ 3435 (1,1,1)和(l, w, h)组成的长方体中从点(1,1,1)能看到的点数,和上面类似,a,b,c都减1就和上面一样了
2) HDU 1695 1 <= x <= b,1 <= y <= d,gcd(x, y) = k的(x, y)对数 (x,y)和(y,x)是同一种,把问题转化成求从(1, b/k)和(1, d/k)两区间中选出两个数gcd为1的对数,然后就转化成上面的问题了,这题要注意的是(x,y)和(y,x)属于一种,因此要去重,设mi=min(b/k, d/k),ma=max(b/k, d/k),则(1, d/k)是(1, b/k)的子集合,因此重复的个数就是cal(mi, mi) / 2,拿总的个数cal(b/k, d/k)减去即可
BZOJ 2301 a <= x <= b, c <= y <= d且gcd(x, y) = k的(x,y)对数,处理方法同上,问题转化为(a/k, b/k)和(c/k, d/k)两区间中选出两个数gcd为1的对数,本题的(x,y)和(y,x)属于不同情况,以下分析若为不同情况则不特殊说明(因为大部分都是当不同来的),然后这里还需要进行一个容斥,再把问题转化成四个区间(1, a/k), (1, b/k), (1, c/k), (1, d/k),那么答案显然就是cal(b / k,d / k) - cal((a - 1) / k,d / k) - cal((c - 1) / k,b / k) + cal((a - 1) / k,(c - 1) / k),不理解的画四个数轴就看出来了
未完待续。。。