鸽子洞原理或者称为抽屉原理

原理概述:

有n只鸽子和m个鸽洞,所有鸽子都住在鸽洞里,如果n>m,那么至少有二只鸽子必须住在同一鸽洞里。

函数观点:

把鸽子看成是定义域A中元素ai,鸽洞看成是值域B中的元素bj,鸽子住鸽洞作为函数关系。

鸽洞原理:

设f是从有限集A到有限集B的函数,若|A|>|B|,则必有a1,a2∈A,a1≠a2,使f(a1)=f(a2)=b∈Bf 包含于B(Bf是象域)。

  反证:若对任意a1,a2∈A,a1≠a2,f(a1)≠f(a2),|A|=|Bf|≤|B|与|A|>|B|矛盾

注:

  鸽洞原理本质上是对一个非一对一函数的充分性判别。

  这个原理看上去容易理解,且有广泛的应用。

例1:在n2+1个不同整数的任意排列中,证明一定存在长为n+1的上升子序列或下降子序列。

证明

设此序列为:a1,a2,…,ak,…,从ak开始上升子序列长度为xk,下降子序列长度为yk,每一个ak(k=1,2,…,n2+1)都对应了(xk,yk)。

若不存在长为n+1的上升或下降子序列,那么xk ≤n,yk≤n,形如(xk,yk)的不同点对至多有n2个,而ak有n2+1个,必有ai,aj(1≤i<j≤n+1)同时对应(xi,yi)=(xj,yj)。

由于ai≠aj,若ai<aj,则xi至少比xj大1,若ai>aj,则yi至少比yj大1,与(xi,yj)=(xj,yj)矛盾。

例2: 132个球放入77个盒子内,每盒至少放一球,求证:一定有21个球放在相邻的某几只盒子里。

证明

设第k个盒子里放的球为bk,得到b1,b2,…,b77,按题意,欲寻找i和j,i>j≥0,使bj+1+bj+2+…+bi=21,即完成证明。

设ak=,得到a1,a2,…,a77,显然,{ak}是严格单调上升的,ai≠aj (i≠

设  Ck=,得到C1,C2,…,C77,{Ck}也是严格单调上升的,Ci≠Cj (i≠j),且C77=153,Ci=ai+21。

{ak}与{Ck}合在一起共有154个,但只能在1~153中取值,由鸽洞原理,必有二个相同,且不会同是ak中的,也不会同是Ck中的,不妨ai=Cj=aj+21,ai-aj=21,即,得到bj+1 +bj+2+…+bi=21。

例3

设x1,x2,…,xn是任意排列的任意整数,证明其中存在连续的若干个数,它们之和是n的倍数。

证明:  设ai

若ai中有n的倍数,则命题成立

若ai中没有n的倍数,由n除ai的余数只能在1~n-1中取

以ai(i=1,2,…,n)作鸽子,1~n-1作鸽洞,ai,aj,使ai≡aj(modn)(i>j),则  n|(ai-aj),  即xj+1+xj+2+…+xi是n的倍数。

摘录自百度文库:鸽子洞原理

时间: 2024-11-08 21:59:30

鸽子洞原理或者称为抽屉原理的相关文章

鸽巢原理(抽屉原理)的详解

抽屉原理 百科名片 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果.这一现象就是我们所说的“抽屉原理”. 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1或多于n+1个元素放到n个集合中去,其中必定至少有一个集合里有两个元素.” 抽屉原理有时也被称为鸽巢原理(“如果有五个鸽子笼,养鸽人养了6只鸽子,那么当鸽子飞回笼中后,至少有一个笼子中装有2只鸽子”).它是组合数学中一个重要的原理. 第一抽屉原理 原

容斥原理和抽屉原理

转自:http://www.exam8.com/zige/gongwuyuan/xingzheng/sl/201408/2984187.html 一.容斥原理 在计数时,要保证无一重复,无一遗漏.为了使重叠部分不被重复计算,在不考虑重叠的情况下,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理. 1.容斥原理1——两个集合的容斥原理 如果被计数的事物有A.B两类,那么,先把A.B两个集合的元素个数相加,发

抽屉原理(鸽巢原理)

转至:https://blog.csdn.net/sand8o8time/article/details/77009749 一.抽屉原理初介绍: 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果.这一现象就是我们所说的“抽屉原理”. 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素.” 抽屉原理有时也被称为鸽巢原理.它是组合数学中一个重要的原

CodeForces 23C Oranges and Apples 抽屉原理

题目链接:点击打开链接 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <set> #include <math.h> using namespace std; #define inf 10000000 #define l

POJ 3370 Halloween treats(抽屉原理)

Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6631   Accepted: 2448   Special Judge Description Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets

POJ 3370 Halloween treats(抽屉原理)

题意  有c个小孩 n个大人万圣节搞活动  当小孩进入第i个大人家里时   这个大人就会给小孩a[i]个糖果  求小孩去哪几个大人家可以保证得到的糖果总数是小孩数c的整数倍  多种方案满足输出任意一种 用s[i]表示前i个打人给糖果数的总和  令s[0]=0  那么s[i]共有n+1种不同值  而s[i]%c最多有c种不同值  题目说了c<=n   所以s[i]%c肯定会有重复值了 这就是抽屉原理了   n个抽屉放大于n个苹果   至少有一个抽屉有大于等于2个苹果 就把s[i]%c的取值个数(c

51NOD 1103 N的倍数(抽屉原理)

传送门 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数. Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数.(2 <= N <= 50000) 第2 - N + 1行:数组A的元素.(0 < A[i] <= 10^9) Output 如果没有符合条件的组合,输出No Solution. 第1行:1个数S表示你所选择的数的数量.

51nod 1103 N的倍数 (抽屉原理)

题目链接:传送门 题意: 略. 分析: 把前缀和统计出来对n取模,任意连个相等的sum[i],sum[j],[i,j]内的数的和都满足这个条件. n个数对n取模,范围为[0~n-1],由抽屉原理可知,最少有一个数模n=0,或者两个数模n相等. 代码如下: #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 50010; LL a[maxn],sum[maxn]; int mai

POJ 2356 Find a multiple 抽屉原理

从POJ 2356来体会抽屉原理的妙用= =! 题意: 给你一个n,然后给你n个数,让你输出一个数或者多个数,让这些数的和能够组成n: 先输出一个数,代表有多少个数的和,然后再输出这些数: 题解: 首先利用前缀和先预处理一下,然后如果sum[i]==0的话,很显然就直接输出i,然后接下来从第一位一直输出到第i位就行了 然后接下来直接用一个mod数组表示上一个答案为这个mod的时候的编号是多少 就是mod[sum[i]%n]=i; 然后判断一下if(mod[sum[i]%n]!=0)然后就直接从m