组合数学:容斥原理(HDU1976)
●容斥原理所研究的问题是与若干有限集的交、并或差有关的计数.
●在实际中, 有时要计算具有某种性质的元素个数.
例:
某单位举办一个外语培训班, 开设英语, 法语两门课.设U为该单位所有人集合, A,B分别为学英语, 法语人的集合, 如图所示.
学两门外语的人数为|AB|,
只学一门外语的人数为|AB|-|AB|,
没有参加学习的人数为|U|-|AB|.
在一些计数问题中, 经常遇到间接计算一个集合中具有某种性质的元素个数比起直接计算来得简单.
例如: 计算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,2n中使j位置上的元素恰好是j的排列的集合, j=1,2,,n. 则排列12n的所有错位排列组成集合:
因为{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
- //**************************************************************************************************
- /*
- 容斥原理的题目,并且同时包含了dfs和欧几里得算法。
- */
- //**************************************************************************************************
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int MAXN = ;
- int p[MAXN];
- int n;
- int m;
- int Result;
- int GCD(int a, int b) { //欧几里得算法,求最大公约数。
- if (b == ) return a;
- else return GCD(b, a % b); //辗转相除。
- }
- int LCM(int a, int b) { //求最小公倍数。
- return a / GCD(a, b) * b;
- }
- int DFS(int n) { //深度优先搜索实现容斥原理。
- int i, j;
- int Cnt_Manifold; //遍历到的数的数量(数集的数量)。
- int Least_Common_Multiple; //遍历到的Cnt_Manifold个数的最小公倍数。
- Result = ; //记录每次深度搜索的结果。
- for (i = ; i < ( << m); i++) { //i的二进制位代表此次遍历查找的是那几个数
- Cnt_Manifold = ;
- Least_Common_Multiple = ; //1与任何数的最小公倍数还是那个数本身,所以初值赋为1.
- for (j = ; j < m; j++)
- if (i & ( << j)) { //筛选出要找的数并求出他们的最小公倍数。
- Cnt_Manifold++;
- Least_Common_Multiple = LCM(Least_Common_Multiple, p[j]);
- }
- if (Cnt_Manifold & ) { //奇数个为正偶数个为负,其作用相当于(-1)^(n - 1).
- Result += n / Least_Common_Multiple;
- }
- else {
- Result -= n / Least_Common_Multiple;
- }
- }
- return Result;
- }
- int main() {
- int cnt;
- int temp;
- while (cin >> n >> m) {
- cnt = ;
- for (int i = ; i < m; i++) {
- cin >> temp;
- if (temp) {
- p[cnt++] = temp;
- }
- }
- m = cnt;
- cout << DFS(n - ) << endl;
- }
- return ;
- }
组合数学:容斥原理(HDU1976)的更多相关文章
- BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理
BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...
- HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举)
HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举) 题意分析 求在[1,n-1]中,m个整数的倍数共有多少个 与 UVA.10325 ...
- UVA.10325 The Lottery (组合数学 容斥原理 二进制枚举)
UVA.10325 The Lottery (组合数学 容斥原理) 题意分析 首先给出一个数n,然后给出m个数字(m<=15),在[1-n]之间,依次删除给出m个数字的倍数,求最后在[1-n]之 ...
- UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
- BZOJ4710: [Jsoi2011]分特产 组合数学 容斥原理
题意:把M堆特产分给N个同学,要求每个同学至少分到一种特产,共有多少种分法? 把A个球分给B个人的分法种数:(插板法,假设A个球互不相同,依次插入,然后除以全排列去重) C(A,B+A) 把M堆特产分 ...
- BZOJ4767: 两双手【组合数学+容斥原理】
Description 老W是个棋艺高超的棋手,他最喜欢的棋子是马,更具体地,他更加喜欢马所行走的方式.老W下棋时觉得无聊,便决定加强马所行走的方式,更具体地,他有两双手,其中一双手能让马从(u,v) ...
- 【bzoj4305】数列的GCD 组合数学+容斥原理
题目描述 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], b[2], ..., ...
- BZOJ4767 两双手(组合数学+容斥原理)
因为保证了两向量不共线,平面内任何一个向量都被这两个向量唯一表示.问题变为一张有障碍点的网格图由左上走到右下的方案数. 到达终点所需步数显然是平方级别的,没法直接递推.注意到障碍点数量很少,那么考虑容 ...
随机推荐
- SQL存储过程传入字段名查询.
根据字段名和对应的值查询. (正确代码):目前发现,需要"分组,排序"等才能解决,如"order by","group by"等. SQL代 ...
- Oracle AWR报告指标全解析-11011552
1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...
- oracle-snapshot too old 示例
一.快照太老例子: 1.创建一个很小的undo表空间,并且不自动扩展. create undo tablespace undo_small datafile '/u01/app/oracl ...
- 打造属于前端的Uri解析器
今天和大家一起讨论一下如何打造一个属于前端的url参数解析器.如果你是一个Web开发工程师,如果你了解过后端开发语言,譬如:PHP,Java等,那么你对下面的代码应该不会陌生: $kw = $_GET ...
- 使用IDEA,利用SpringMVC框架建立HelloWorld项目
无论是从头开始学习一门新的语言还是技术,我们的入门都是从HelloWorld开始,也许就是因为这样,我在学习Spring MVC的时候,就有一种偏执,一定要写出一个HelloWorld来.研究了好久, ...
- 仿小米网jQuery全屏滚动插件fullPage.js
演 示 下 载 简介 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面,QQ浏 ...
- 参数计数不匹配,未处理System.Reflection.TargetParameterCountException
系统出现异常:参数计数不匹配,未处理System.Reflection.TargetParameterCountException, 系统会显示如下的异常信息,但异常信息往往与实际异常位置差十万八千量 ...
- Android Context作用
Context 用于访问全局信息的接口 App的资源: strings, drawable资源等等 工程代码:LearnContext.zip ---------------------------- ...
- Django Admin 简单部署上线
前言 打算为公司弄一个管理公用密码的平台,由于比较懒,就选择使用Django admin,默认的admin并不漂亮,于是我使用了这个django-suit插件来美化 如图: 是不是比原来的漂亮多了. ...
- python模块之socket
43.python模块之socket: Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式 UDP通讯: Server: import socket port=8081 ...