所谓鸽巢原理,即n+1只鸽子,只有n个巢,则至少有一鸽巢有两只鸽子。
鸽巢原理理解起来并不困难,有些题目需要转换一下。
POJ3770
题意:有n个数,可能相同也可能不相同,从中取出一些数,使它们的和能被c整除(c<=n),任意输出一种方案。
解:构造序列si,使得
s1 = a1
s2 = a1 + a2
s3 = a1 + a2 + a3
...
sn = a1 + a2 + ... + an
这样,有两种可能:
(1) 若其中有一项si是c的倍数,则即找到解;
(2) 否则,si=ri (mod c),取值只可能在[1,c-1]这c-1个数,然而有n个数,且c<=n,则必然存在两个数si和sj对c取模相等。首先肯定了原问题的答案肯定存在。若sj>si,则序列ai+1,...aj即为原问题的一种方案。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int Max = 100005;
int a[Max];
int flag[Max];
int main()
{
int i;
int c,n;
while(true)
{
scanf("%d %d",&c,&n);
if(c==0&&n==0)
break;
memset(flag,0,sizeof(flag));
for(i = 1; i <= n; i++)
scanf("%d",&a[i]);
int rmd = 0;
int s=1,t=1;
for(i = 1; i <= n; i++)
{
rmd = (rmd + a[i])%c;
if(rmd==0)
{
s = 1;
t = i;
break;
}
else if(flag[rmd])
{
s = flag[rmd]+1;
t = i;
break;
}
else
flag[rmd] = i;
}
for(i = s; i <= t; i++)
{
printf("%d",i);
printf("%c",i==t?'\n':' ');
}
}
return 0;
}
分享到:
相关推荐
书中将组合数学分为六个章节进行介绍,分别是排列与组合、母函数与递推关系、容斥原理与鸽巢原理、贝努利特引理与波利亚定理、区组设计与编码、组合算法与复杂性分析。这六个部分构成组合数学的基础框架,并且每部分...
以下将详细介绍组合数学的一些核心知识点及其在编程中的应用。 1. **组合与排列**:组合是不考虑顺序的选择,例如从n个不同元素中选取k个,表示为C(n, k)或n选k。排列则是考虑顺序的选择,从n个不同元素中选取k个并...
第六章详细讨论了容斥原理及其应用,包括错位排列、禁止位置问题等。此外,还介绍了莫比乌斯反演原理作为容斥原理的推广。 递推关系和生成函数是组合数学中解决序列问题的重要工具。第七章介绍了线性齐次递推关系、...
综上所述,西安交通大学的组合数学课件对于理解组合数学这一数学分支及其在多个学科中的应用具有重要意义。通过学习容斥原理、鸽巢原理、Polya定理和幻方等内容,学生不仅能够掌握组合数学的基本理论,还能在实际...
3. **鸽巢原理**:讲解了最简单的计数原则,用于解决“至少有一个”的问题,是组合计数的基础。 **第二章:容斥原理与递推关系** 1. **容斥原理**:给出了加法原理和乘法原理的推广形式,即容斥原理,用于计算有...
2. **鸽巢原理**:又称抽屉原理,是解决存在性问题的有力工具,书中可能介绍了其不同形式和应用。 3. ** Burnside引理**:在组合设计理论中占有重要地位,用于计算有限群作用下的轨道数。 4. **生成函数**:作为...
"鸽巢原理"(又称抽屉原理)是组合数学中的一个基本原理,它的核心思想是:如果有更多的物体(比如“鸽子”)要放入较少的容器(比如“鸽巢”),那么至少有一个容器会包含多于一个的物体。在这个袜子问题中,毛毛有...
抽屉原理,又称鸽巢原理或者狄利克雷原理,是组合数学中一个非常重要的概念。它主要表述为:如果有\( n+1 \)个物品放入\( n \)个抽屉中,则至少有一个抽屉含有不少于两个物品。这一原理看似简单,但在解决复杂问题时...
- **典型问题**:鸽巢原理、容斥原理等。 #### 5. 逻辑学 逻辑学是研究推理有效性的学科,是计算机科学和人工智能的基础之一。 - **基本概念**:命题、命题逻辑、谓词逻辑等。 - **典型问题**:逻辑推理、命题...
这个压缩包“组合数学课后习题总结.rar”很可能包含了关于组合数学课程的一些课后习题及其解答,这对于学习者深入理解和掌握组合数学的概念、方法与技巧具有极大的帮助。 在组合数学中,我们通常会遇到以下几个核心...
根据提供的信息,“离散数学及其应用(中文版第四版)”这本书主要涵盖了离散数学的基础理论及实际应用。离散数学作为计算机科学的核心基础之一,它不仅为算法设计与分析提供必要的工具,还广泛应用于软件工程、数据...
5. **组合数学**:组合数学研究有限集合中对象的选择和排列。计数原理、组合恒等式、鸽巢原理等工具在解决实际问题时非常实用,比如计算可能性、优化问题等。 6. **代数结构**:包括群、环、域等抽象代数概念,它们...
- **图的遍历**:深度优先搜索(DFS)和广度优先搜索(BFS)及其应用。 4. **组合数学**: - **计数原理**:加法原理、乘法原理,排列、组合的计算公式。 - **二项式定理**:展开 `(a+b)^n`,以及组合恒等式。 ...
- **鸽巢原理**: 应用鸽巢原理解决实际问题。 - **容斥原理**: 容斥原理的基本概念及其在组合计数中的应用。 - **生成函数**: 利用生成函数解决序列求和等问题。 ### 二、进阶技巧 #### 1. 矩阵与线性代数 - **...
二项式定理、鸽巢原理、容斥原理等是组合数学中的基本工具,它们在算法复杂度分析、概率计算和编码理论中有广泛应用。 5. **递归与归纳**:递归是计算机科学中解决问题的一种常用方法,而归纳则是证明方法。理解...
组合数学关注的是有限集合的组合性质,如排列、组合、二项式定理、鸽巢原理等,这些在解决实际问题中非常实用,比如计算可能性、概率分析等。 数理逻辑是离散数学的另一重要部分,它探讨逻辑语言和逻辑系统的形式化...
学习排列和组合的计算方法,如组合恒等式、鸽巢原理、二项式定理、帕斯卡定律和容斥原理。此外,递推关系和生成函数也是组合数学中的重要工具。 六、数理逻辑 数理逻辑是离散数学的高级部分,包括形式系统、语义和...
4. **组合数学**:组合数学研究有限集合的组合性质,包括组合计数、排列、二项式定理、鸽巢原理、容斥原理等。这些工具在分析算法复杂度、计算概率以及设计高效算法时十分有用。 5. **初等数论**:数论研究整数的...
掌握容斥原理、鸽巢原理及其在计数问题中的应用。 6. **递归与归纳**:了解递归定义的概念,学习如何建立递归函数和解决递归问题。掌握归纳法在证明中的应用,尤其是数学归纳法。 7. **布尔代数**:布尔代数是...
- **鸽巢原理**:介绍这一基本原理及其在解决实际问题中的应用。 #### 4. 递推关系与数学归纳法 - **递推关系**:通过递推公式来定义数列,分析递推关系的求解方法。 - **数学归纳法**:作为证明方法的一种,用于...