莫比乌斯反演归纳
2015-10-14 22:17
246 查看
莫比乌斯反演
基础公式: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),不理解的画四个数轴就看出来了
未完待续。。。
基础公式: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),不理解的画四个数轴就看出来了
未完待续。。。
相关文章推荐
- 笔试题——数据库索引的作用
- lintcode-木材加工-183
- 再读大道之简第三章
- 高级软件工程的第一次作业:回顾自己本科设计
- 关于github在mac 10.10上无法提交代码的解决办法---备用
- oracle10g 安装笔记
- 关于java中有符号数转换成无符号数的相关问题
- 大道至简第三章读后感
- ISO/IEC 9899:2011 条款6.7.1——存储类说明符
- 黑马程序员_JAVA笔记之(File类,过滤器,递归练习)
- PL/SQL Developer 连接Oracle数据库详细配置方法
- C# Datetime.Ticks将时间转换成以秒为单位与格林尼治时间
- 更踪设备的地理位置(LocationManager)
- 九度OJ 1004:Median
- oracle 命令1
- duilib库分析: 消息流程分析
- linux 使用proxychains连接代理服务器
- 高性能javascript 笔记 第一章 loading and executing (一)
- 九度OJ 1004:Median
- PostgreSQL general public partition table trigger