HDU 1808 Halloween treats (鸽巢原理)(数学)

原题:http://acm.hdu.edu.cn/showproblem.php?pid=1808

题意:给定c,给n个数,且n>=c,求是否能选某些数,使得它们之和是c的倍数。

鸽巢原理(抽屉原理):假设有n个鸽笼,有kn+1只鸽子,将所有的鸽子都放入笼子里,那么至少有一个笼子最少装有k+1只鸽子。

解题思路:首先得到这n个数的前缀和sum,其中sum[0]=0,这样我们就得到了n+1个数。由于题目是要求数的和为c的倍数,因此将sum依次对c取模后对结果没有影响,取模后,sum数组的每个数的范围都是0~c-1。又因为n>=c,根据鸽巢原理,sum数组中至少存在两个相同的数sum[i]和sum[j]且i!=j,此时(sum[i]-sum[j])就是c的倍数了,即从原数列的j+1项到i项之和必为c的倍数。
注意应该在递推求sum的每一步都进行取模c的操作,以防超范围。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<stdlib.h>
using namespace std;
#define scan(n) scanf("%d",&n)
#define ll long longint a[100005];
ll sum[100005];
int v[100005];int main()
{int c,n,i,j;int num,l,r;while(cin>>c>>n){if(c==0&&n==0)break;for(i=1;i<=n;i++)scan(a[i]);sum[0]=0;for(i=1;i<=n;i++)sum[i]=(sum[i-1]+a[i])%c;for(i=1;i<=n;i++)sum[i]%=c;memset(v,0,sizeof(v));for(i=1;i<=n;i++){if(sum[i]==0){cout<<1;for(j=2;j<=i;j++)cout<<' '<<j;cout<<endl;break;}else if(v[sum[i]]){r=i;num=sum[i];for(j=1;j<=n;j++){if(sum[j]==num){l=j+1;break;}}cout<<l;for(j=l+1;j<=r;j++)cout<<" "<<j;cout<<endl;break;}v[sum[i]]=1;}}return 0;
}

HDU 1808 Halloween treats (鸽巢原理)(数学)相关推荐

  1. POJ 3370 Halloween treats——鸽巢原理+思维

    [题目描述] POJ 3370 Halloween treats Description Every year there is the same problem at Halloween: Each ...

  2. 数学--数论--鸽巢原理

    鸽巢原理: 所谓鸽巢原理即n+1只鸽子,只有n个巢,则至少有一鸽巢有两只鸽子. 鸽巢原理又叫抽屉原理,球盒原理. 推广: 如果要把n个物件分配到m个容器中,必有至少一个容器容纳至少⌈n / m⌉个物件 ...

  3. 有趣的数学问题-鸽巢原理

    鸽巢原理,也称抽屉原理.形象地说明一下:假设有n个鸽笼,有kn+1只鸽子,将所有的鸽子都放入笼子里,那么至少有一个笼子最少装有k+1只鸽子. 常见形式: 1.把多于n+1只鸽子放到n个笼子里,则至少有 ...

  4. 抽屉原理(鸽巢原理)

    一.抽屉原理初介绍: 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果.这一现象就是我们所说的"抽屉原理". 抽屉原理的一般含 ...

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

    抽屉原理 百科名片 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果.这一现象就是我们所说的"抽屉原理". 抽屉原理的一般含义为: ...

  6. 算法之组合数学及其算法篇(二) ----- 鸽巢原理

    鸽巢原理 前言 鸽巢原理 运用1 运用二 运用三 鸽巢原理的推广 推论 运用一 运用二 鸽巢原理在几何上的作用 鸽巢原理对于数学的证明 前言 鸽巢原理又称抽屉原理或鞋盒原理,这个原理最早是由狄利克雷( ...

  7. CodeForces - 1501C Going Home(鸽巢原理+暴力)

    题目链接:点击查看 题目大意:给出 nnn 个数,问是否存在四个数满足:a+b=c+da+b=c+da+b=c+d 题目分析:官方题解是直接 O(n2)O(n^2)O(n2) 暴力,因为每个数的范围是 ...

  8. 【离散数学中的数据结构与算法】九 鸽巢原理

    鸽巢原理是非常著名的原理,生活正用的也很多. 文章目录 1 简单鸽巢原理的应用 2 定理(一般性鸽巢原理) 2.1 应用 3 总结 1 简单鸽巢原理的应用 定理(鸽巢原理) 若有 n 个鸽巢, n+1 ...

  9. 鸽巢原理(抽屉原理)

    鸽巢原理和抽屉原理是同义词,已合并. 抽屉原理 百科名片 抽屉原理 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果.这一现象就是我们所说的" ...

最新文章

  1. MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)的真正原因...
  2. VTK修炼之道78:交互与拾取_点拾取
  3. oracle10 监听日志,windows 清空oracle的监听日志listener.log
  4. linux下静默安装oracle10g,CentOS下远程静默安装Oracle10g笔记
  5. nginx的请求接收流程(二)
  6. NLP复习资料(8)-知识图谱、信息抽取
  7. linux下调试工具的应用
  8. 蓝牙4.0大数据分包处理
  9. 服务端设置忽略更新_react服务端渲染: cookie如何透传给后端,后端如何设置cookie...
  10. ES6高频面试题目整理
  11. (转)深入理解最强桌面地图控件GMAP.NET ---离线地图
  12. vue 将数据保存到vuex中
  13. MyBatis学习总结_03_优化MyBatis配置文件中的配置
  14. php vm_facebook hiphop php vm 兑现概述(二)
  15. python中获取中位数的两种方法
  16. OfficeExcel(1)
  17. Java并发的一些总结(面试须知)
  18. Qt编写的项目作品11-带频谱的音乐播放器
  19. 七.全文检索ElasticSearch经典入门-聚合查询
  20. 聆思CSK6开发工具使用详解(支持Zephyr开发)

热门文章

  1. BI项目的各种产出物
  2. 在开发环境使用 TiUP安装TiDB集群
  3. vue实例和组件的区别
  4. duet连win10_在Windows PC上使用Duet Display时连接不上Apple设备的解决方法之一
  5. PAC学习框架-泛化误差
  6. 【CF226C】Anniversary
  7. 1157 Anniversary
  8. Windows下开启Mysql慢查询详解
  9. 藏宝阁显示角色可买服务器,梦幻西游藏宝阁里面买角色时选的可转入服务器是不是一定可以转...
  10. 少儿编程Scratch学习教程2--官方初学指南