容斥原理
来源:互联网 发布:中企动力源码 编辑:程序博客网 时间:2024/05/22 17:33
这道题可以说是容斥原理模板题了吧
首先说下容斥原理,可以参考百度百科容斥原理
其实高中我们也学过这个东西。
举个例子,1到100中能被2或3整除的数的个数,首先可以算出能被2整除的数的个数,为100/2=50个,能被3整除的有100/3=33个,然而能够同时被2和3整除的数被计算了两次,能同时被2和3整除即等价于能够被2和3 的最小公倍数6整除。有100/6=16个。故能被2或3整除的数有50+33-16=67个
那如果要找出1到n中能被a1,a2,a3,,,am这m个数中至少有一个整除的数有多少个呢?
那很显然就可以套用容斥原理的公式了。具体过程《挑战程序设计竞赛》这本书高级篇计算里说得很详细。
回到这道题。
直接枚举肯定会超时,我们需要用容斥原理计数。首先我们要理解这样一个事实,n和m不互质,那么它们最大公约数大于1,由于n和m都可以分解质因数,那么它们必然至少存在一个质因子是相同的。
好,给定区间[l,r],我们如何计算出有多少数与n互质呢,这跟欧拉函数并没有什么关系,插一句,欧拉函数是求小于n且与n互质数的总数。
我们可以这样考虑,区间[l,r]总有r-l+1个数,如果我们计算出有x个数与n是不互质的,那么最后互质的总数为r-l+1-x。
不互质的数我们可以用容斥定理高效求出。
首先对n进行分解质因数。假设分解后有y个因数,如果区间[l,r]中的数能整除某个因数,那么这个数必然与n不互质。
如何实现容斥原理公式呢?首先要用到一个技巧,即利用整数的二进制编码枚举子集,对于每个子集,算出最小公倍数,倘若子集元素个数为奇数个,那个这次计数的符号为+,否则为-。
下面是AC代码:
阅读全文
0 0
- 容斥原理
- 容斥原理 POJ3904
- 【容斥原理】八
- 【八】容斥原理
- 广义容斥原理
- 容斥原理
- 容斥原理 专题
- 容斥原理 专题
- hdu4390 容斥原理
- hdu1695 容斥原理
- HDU3929(容斥原理)
- 整除 容斥原理
- HDU4390(容斥原理)
- 容斥原理
- poj3904 容斥原理
- 容斥原理应用
- bzoj2393 容斥原理
- hdu4135 容斥原理
- ios 消除 字符串 首尾空格
- 多因子模型之因子(信号)测试平台----因子值的处理(二)
- MySQL-5.6.13免安装版配置方法
- java网络爬虫
- AngularJS自定义指令controller和link传参
- 容斥原理
- C#与MySQL直接连接
- 素数筛法
- 【剑指offer】面试题 53:数字在排序数组中出现的次数
- 【学习笔记】深入理解超时调用(setTimeout)和间歇调用(setInterval)
- Restful在Eclipse调试环境中的坑SpringMVC 和 Jersey
- 多线程
- 【安卓学习笔记】JAVA基础Lesson5-关键字this
- ArcEngine GP工具——Summary Statistics(汇总统计)功能的实现