容斥原理 && 欧拉函数 && 抽屉原理
来源:互联网 发布:unity3d小球滚动 编辑:程序博客网 时间:2024/06/01 08:52
原文链接:点击打开链接
(1)容斥原理 :重要应用 求出一个数n在区间[1,m]里面有多少个数与它互质。假设数据不超过int型。
实现过程分为两步:
1, 求出m的质因子 并保存在数组里面;
2, 求出区间[1,n]里面有多少个数与m不互质。
代码:
上面的代码实现是很简单的,也是很好理解的。 网上还有DFS版本,位运算版本的以及递归版本的,这里再给个递归的(另外本人理解不太透彻),至于其它两个有兴趣的可以上网查下。
递归版本:
(2)欧拉函数:说白了,就是指一个数n在[1,n-1]区间有多少个数与它互质(和容斥原理一样的应用)。
比如说,euler[n] = m代表的意思是在区间[1,n-1]里面有m个数与n互质。
欧拉函数公式:(我们假设n的质因子有x,y) euler[n] = n * (1-1/x) * (1-1/y)。若有多个继续添上即可。
欧拉函数拓展:小于或等于n的数中(n > 1),与n互质的数的总和为:euler[n] * n / 2。
现给个实例:求区间[1,100]内所有数的欧拉函数。这里eu[1] = 1。我不知道会不会有一些题目eu[1] = 0。。。注意啊
求欧拉函数 有两个思路:
1, 筛素数打表,用数组记录每个数的欧拉函数(适用于n不是很大的情况,因为数组不能开无限大);
2, 直接求法计算单个欧拉函数,对于有些题目会比较慢(对于很大的n依然可以求解)。
筛素法:
计算单个欧拉函数:
对于很多题目,容斥原理若和欧拉函数一起使用,或许会增加程序效率。
(3) 抽屉原理: 又称鸽巢原理,指的是n+1个苹果放进n个盒子里面,一定会有一个盒子有两个苹果。
定理: 一个由n个数构成的数列,总能找到若干个连续的数 使它们之和能被n整除。
证明: 对于数列里面的元素a[1],a[2],...... a[n]。我们可以构造一个数组sum[],用sum[ i ]来存储前i个元素之和(包括第i个元素)。
那么sum数组里面所有的元素只有两种情况:(1) 至少存在一个sum[ i ] 能被n整除;(2) 对于所有的sum[ i ] 都不能被n整除 。
情况(1):定理成立。。。
情况(2):首先我们知道sum数组里面有n个元素,又因为它们都不能被n整除,那么我们可以得到以下信息:任意的(sum[i] %n)都非0且结果都在(1到n-1范围里面)
这样的话--> n个结果在 1到n-1 范围内,必然存在两个相等的结果。而这两个相同结果所对应的sum[] 之差 必定能被 n整除。
证毕。
对于抽屉原理,可以有以下拓展:(1) 数列里面元素个数只要大于或者等于n也成立 (2) 找到的 若干个数 不是连续的也成立。
- 容斥原理 && 欧拉函数 && 抽屉原理 总结
- 容斥原理 && 欧拉函数 && 抽屉原理
- 容斥原理 && 欧拉函数 && 抽屉原理 总结
- 抽屉原理&&容斥原理&&欧拉函数 (小总结)
- hdu1695GCD(欧拉函数+容斥原理)
- HDU1659 欧拉函数+容斥原理
- 容斥原理 和 欧拉函数
- 欧拉函数&&容斥原理
- 容斥原理 和 欧拉函数
- 欧拉函数+容斥原理-HDU1695
- HDU/HDOJ 1695 GCD 欧拉函数+容斥原理
- HDU1695 欧拉函数+容斥原理+筛质因子
- HDU 1695 欧拉函数+容斥原理
- HDU 1695 GCD 欧拉函数+容斥原理
- hdu1695 GCD (容斥原理+欧拉函数)
- HDU_1695_GCD(欧拉函数+容斥原理+DFS)
- hdu 1695 GCD 欧拉函数+容斥原理
- hdu1695 GCD 欧拉函数+容斥原理
- Xml文件的保存
- 重定向和转发的区别
- 栈的简单实现
- jsp标准标签库
- Java基础学习(五)
- 容斥原理 && 欧拉函数 && 抽屉原理
- [codeforces117E]Tree or not Tree
- 搭建一个spring-boot项目 4
- hduoj-2824【欧拉函数】
- List.addAll()操作总结
- CodeForces
- [jzoj4665][CF407E]k-d-sequence
- 个人对this总结
- bzoj1634