●容斥原理所研究的问题是与若干有限集的交、并或差有关的计数.

●在实际中, 有时要计算具有某种性质的元素个数.

例:

某单位举办一个外语培训班, 开设英语, 法语两门课.设U为该单位所有人集合, A,B分别为学英语, 法语人的集合, 如图所示.

学两门外语的人数为|AB|,

只学一门外语的人数为|AB|-|AB|,

没有参加学习的人数为|U|-|AB|.

在一些计数问题中, 经常遇到间接计算一个集合中具有某种性质的元素个数比起直接计算来得简单.

例如: 计算1到700之间不能被7整除的整数个数.
先计算1到700之间能被7整除的整数个数=700/ 7=100, 所以1到700之间不能被7整除的整数个数=700-100=600.

上面举的间接计数的例子是利用了如下原理:如果A是集合S的子集, 则A中的元素个数等于S中的元素个数减去不在A中的元素个数, 这个原理可写成:

● 原理的重要推广, 称之为容斥原理,并且将它运用到若干问题上去, 其中包括:
     错位排列、
    有限制的排列、
    禁位排列和
    棋阵多项式等.

容斥原理:

DeMorgan定理:设A,B为全集U的任意两个子集,则

DeMorgan定理的推广:设A1, A2……An为U的子集,则

1.两个集合的容斥原理:

2.三个集合的容斥原理:

3.n个集合上的容斥原理:

4.余集形式:

错牌问题——容斥定理的应用实例

(1..n)的错位排列个数记为Dn.  结论如下:

可以用容斥原理证明:
  设S={1,2,3,,n}的集合, S0为S的全排列,则s0=n! . 令Aj表示排列1,2n中使j位置上的元素恰好是j的排列的集合, j=1,2,,n. 则排列12n的所有错位排列组成集合:

因为{1,2,3,,n}的k组合为C(n,k)个,
应用容斥原理得到:

HDU1796 How many intergers can you find

How many integers can you find

Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6281    Accepted Submission(s): 1804

Problem Description

Now you get a number N, and a M-integers set, you should find out how many integers which are small than N, that they can divided exactly by any integers in the set. For example, N=12, and M-integer set is {2,3}, so there is another set {2,3,4,6,8,9,10}, all the integers of the set can be divided exactly by 2 or 3. As a result, you just output the number 7.

Input

There are a lot of cases. For each case, the first line contains two integers N and M. The follow line contains the M integers, and all of them are different from each other. 0<N<2^31,0<M<=10, and the M integer are non-negative and won’t exceed 20.

Output

For each case, output the number.

Sample Input

12 2 2 3

Sample Output

7

Author

wangye

Source

2008 “Insigma International Cup” Zhejiang Collegiate Programming Contest - Warm Up(4)

Recommend

wangye

Submit

 1 //**************************************************************************************************
 2 /*
 3     容斥原理的题目,并且同时包含了dfs和欧几里得算法。
 4 */
 5 //**************************************************************************************************
 6
 7
 8 #include<cstdio>
 9 #include<cstring>
10 #include<iostream>
11
12 using namespace std;
13
14 const int MAXN = 20;
15 int p[MAXN];
16 int n;
17 int m;
18 int Result;
19
20 int GCD(int a, int b) { //欧几里得算法,求最大公约数。
21     if (b == 0) return a;
22     else return GCD(b, a % b); //辗转相除。
23 }
24
25 int LCM(int a, int b) { //求最小公倍数。
26     return a / GCD(a, b) * b;
27 }
28
29 int DFS(int n) { //深度优先搜索实现容斥原理。
30     int i, j;
31     int Cnt_Manifold; //遍历到的数的数量(数集的数量)。
32     int Least_Common_Multiple; //遍历到的Cnt_Manifold个数的最小公倍数。
33     Result = 0; //记录每次深度搜索的结果。
34     for (i = 1; i < (1 << m); i++) { //i的二进制位代表此次遍历查找的是那几个数
35         Cnt_Manifold = 0;
36         Least_Common_Multiple = 1; //1与任何数的最小公倍数还是那个数本身,所以初值赋为1.
37         for (j = 0; j < m; j++)
38             if (i & (1 << j)) { //筛选出要找的数并求出他们的最小公倍数。
39                 Cnt_Manifold++;
40                 Least_Common_Multiple = LCM(Least_Common_Multiple, p[j]);
41             }
42         if (Cnt_Manifold & 1) { //奇数个为正偶数个为负,其作用相当于(-1)^(n - 1).
43             Result += n / Least_Common_Multiple;
44         }
45         else {
46             Result -= n / Least_Common_Multiple;
47         }
48     }
49     return Result;
50 }
51
52 int main() {
53     int cnt;
54     int temp;
55     while (cin >> n >> m) {
56         cnt = 0;
57         for (int i = 0; i < m; i++) {
58             cin >> temp;
59             if (temp) {
60                 p[cnt++] = temp;
61             }
62         }
63         m = cnt;
64         cout << DFS(n - 1) << endl;
65     }
66     return 0;
67 }

转载于:https://www.cnblogs.com/xzrmdx/p/5317441.html

组合数学:容斥原理(HDU1976)相关推荐

  1. UVA - 11806 Cheerleaders(组合数学+容斥原理)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,现在有k个拉拉队员,要求在第一列.最后一列.第一行和最后一行至少有一个拉拉队员,注意以下要求: 四个角上的拉拉队员可以同时属于两条边 每个方格至多只 ...

  2. 组合数学—容斥原理与鸽巢原理

    目录 一 写在开头 二 容斥原理 三 鸽巢原理 四 Ramsey定理 五 Burnside引理与波利亚定理 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 本文内容为<组合数 ...

  3. bzoj 4710 [Jsoi2011]分特产 组合数学+容斥原理

    题面 题目传送门 解法 考虑容斥原理 显然,我们可以枚举有多少个人没有收到 然后就转化成一个组合问题了 假设现在有\(x\)个物品,\(n\)个人,可以有人没有被分到,那么分给这\(n\)个人的方案数 ...

  4. 组合数学-容斥原理-求指定区间内与n互素的数的个数

    求指定区间内与n互素的数的个数 给出整数n和r.求区间[1,r]中与n互素的数的个数. 去解决它的逆问题,求不与n互素的数的个数. 考虑n的所有素因子pi(i=1···k) 在[1,r]中有多少数能被 ...

  5. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

  6. 组合数学 | 容斥原理与鸽巢原理

    目录 容斥原理 鸽巢原理 容斥原理 德摩根定理:设A,B为全集U的任意两个子集,则 德摩根定理推广:设A1,A2-An为U的子集,则 容斥原理: 两个集合的容斥原理 设A和B是分别具有性质P1和P2的 ...

  7. BZOJ4487 JSOI2015染色问题(组合数学+容斥原理)

    逐个去除限制.第四个限制显然可以容斥,即染恰好c种颜色的方案数=染至多c种颜色的方案数-染至多c-1种颜色的方案数+染至多c-2种颜色的方案数-- 然后是限制二.同样可以容斥,即恰好选n行的方案数=至 ...

  8. [组合数学] 容斥原理polya定理

    数学 A = 170 物理 B=130 化学C=120 A ∩ B = 45 A ∩ C = 20 B ∩ C = 22 A ∩ B ∩ C = 3 A\cap B = 45\quad A\cap C ...

  9. 【数学专题】组合数学与计数

    整理的算法模板合集: ACM模板 目录 AcWing 1307. 牡牛和牝牛(递推) AcWing 1308. 方程的解 AcWing 1309. 车的放置(组合数学,分类讨论) AcWing 131 ...

最新文章

  1. c语言结点初始化,C语言双向链表简单实现及图示(初始化/插入节点/删除节点)...
  2. lua学习笔记之环境
  3. SIM7600X 获取GPS信号 TCP/IP连接与PPP拨号上网 4G上网
  4. pat天梯赛L1-056. 猜数字
  5. weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...
  6. python直方图均衡化代码_基于matlab的直方图均衡化代码
  7. HDU Problem - 5101 Select(二分)
  8. 专题:生物医疗大数据
  9. pulse 去马赛克软件_最新黑科技...马赛克也能去了!!
  10. spring AOP概念及xml配置
  11. 什么是编译性语言、解释性语言和脚本语言
  12. onvif python3 推送音频_Python3-onvif协议之相机截图
  13. 学生专用计算机怎么没声音,班班通电脑没声音了
  14. canvas画布调节字符间距
  15. 模拟新浪微博随便看看界面布局
  16. 火狐浏览器怎么设置打开书签的时候在新标签页打开
  17. 用逻辑回归实现鸢尾花数据集分类(1)
  18. HDU 2075 JAVA
  19. C++ 计算直线的交点数(动态规划)
  20. android系统解锁代码,魅蓝note2 解锁bootloader,刷twrp,刷安卓7.1.1系统(示例代码)

热门文章

  1. 男人要懂得赞美女人,女人要懂得鼓励男人
  2. 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解
  3. java----单例模式
  4. mysql主从备份及原理分析
  5. 一个普通handler会持有activity引用吗_详解handler机制
  6. Redis 集群密码配置
  7. 作家如何利用Git更好地完成工作
  8. 2017 开源软件排行_2017年面向设计师和艺术家的顶级开源解决方案
  9. Spring Security 基于数据库的认证
  10. RANSAC迭代估计