题意:给你N个数,从中取出任意个数的数 使得他们的和 是 N的倍数;

在鸽巢原理的介绍里面,有例题介绍:设a1,a2,a3,……am是正整数的序列,试证明至少存在正数k和l,1<=k<=l<=m,是的和ak+ak+1+……+al是m的倍数,接下来开始证明:

构造一个序列s1=a1,s2=a1+a2,……,sm=a1+a2+……+am,那么会产生两种可能:

1:若有一个sn是m的倍数,那么定理成立:

2:假设上述的序列中没有任何一个元素是m的倍数,令rh ≡ sh mod m;其中h=1,2,……,m;我们已知上面的所有项都非m的倍数,得到s1模m的余数是r1,s2模m的余数是r2,同理往下类推,r是一个余数序列,在这里所有的余数都不为0,因为假设是不存在有m的倍数的,所以r序列的元素小于m,根据抽屉原理(鸽巢原理),m个余数在[1,m-]区间里的取值至少存在一对rh,rl,并且满足 rh=rk,即sh和sk满足

sk ≡ sh mod m,那么假设h>k,得到

sh-sk = (a1+a2+……+ah) - (a1+a2+……+ak)

sh - sk =ak+1 +ak+2 +……+ah ≡ 0 mod m(此处的k是序列a的下标)

证明到此结束;

那么熟悉根据抽屉原理(鸽巢原理),稍微动动脑筋便能做这道题目了

先处理出前k个数的sum[k] (1 <= k <= n) 同时对n进行取余操作,如果有一个sum[k]等于0,那么这个sum就是n的倍数,然后根据鸽巢原理,有n个余数r ,0 <= r <=n ,如果没有余数0,那么至少有两个余数是相同的,即这两个sum相减得到的差就是n的倍数,

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<list>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<string>
  7. #include<queue>
  8. #include<stack>
  9. #include<map>
  10. #include<vector>
  11. #include<cmath>
  12. #include<memory.h>
  13. #include<set>
  14.  
  15. #define ll long long
  16.  
  17. #define eps 1e-7
  18.  
  19. #define inf 0xfffffff
  20. const ll INF = 1ll<<61;
  21.  
  22. using namespace std;
  23.  
  24. //vector<pair<int,int> > G;
  25. //typedef pair<int,int > P;
  26. //vector<pair<int,int> > ::iterator iter;
  27. //
  28. //map<ll,int >mp;
  29. //map<ll,int >::iterator p;
  30. //
  31.  
  32. int a[100012],mark[1000012],sum[100012];
  33.  
  34. void clear()
  35. {
  36. memset(a,0,sizeof(a));
  37. memset(sum,0,sizeof(sum));
  38. memset(mark,0,sizeof(mark));
  39. }
  40.  
  41. int main()
  42. {
  43. int n;
  44. while(scanf("%d",&n)==1)
  45. {
  46. clear();
  47. for(int i=1;i<=n;i++)
  48. {
  49. scanf("%d",&a[i]);
  50. sum[i] = sum[i-1] + a[i];
  51. sum[i] %= n;
  52. mark[i] = 0;
  53. }
  54. for(int i=1;i<=n;i++)
  55. {
  56. if(sum[i]==0)
  57. {
  58. printf("%d\n",i);
  59. for(int j=1;j<=i;j++)
  60. {
  61. printf("%d\n",a[j]);
  62. }
  63. break;
  64. }
  65. else if(mark[sum[i]])
  66. {
  67. printf("%d\n",i-mark[sum[i]]);
  68. for(int j=mark[sum[i]]+1;j<=i;j++)
  69. printf("%d\n",a[j]);
  70. break;
  71. }
  72. mark[sum[i]]=i;
  73. }
  74. }
  75. return EXIT_SUCCESS;
  76. }

POJ2356 Find a multiple 抽屉原理(鸽巢原理)的更多相关文章

  1. [POJ2356]Find a multiple 题解(鸽巢原理)

    [POJ2356]Find a multiple Description -The input contains N natural (i.e. positive integer) numbers ( ...

  2. poj2356 Find a multiple(抽屉原理|鸽巢原理)

    /* 引用过来的 题意: 给出N个数,问其中是否存在M个数使其满足M个数的和是N的倍数,如果有多组解, 随意输出一组即可.若不存在,输出 0. 题解: 首先必须声明的一点是本题是一定是有解的.原理根据 ...

  3. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  4. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  5. ACM数论之旅14---抽屉原理,鸽巢原理,球盒原理(叫法不一又有什么关系呢╮(╯▽╰)╭)

    这章没有什么算法可言,单纯的你懂了原理后会不会运用(反正我基本没怎么用过 ̄ 3 ̄) 有366人,那么至少有两人同一天出生(好孩子就不要在意闰年啦( ̄▽ ̄")) 有13人,那么至少有两人同一月 ...

  6. [POJ2356] Find a multiple 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8776   Accepted: 3791   ...

  7. [poj2356]--Find a multiple ——鸽巢原理

    题意: 给定n个数,从中选取m个数,使得\(\sum | n\).本题使用Special Judge. 题解: 既然使用special judge,我们可以直接构造答案. 首先构造在mod N剩余系下 ...

  8. poj Find a multiple【鸽巢原理】

    参考:https://www.cnblogs.com/ACShiryu/archive/2011/08/09/poj2356.html 鸽巢原理??? 其实不用map但是习惯了就打的map 以下C-c ...

  9. poj 2356 Find a multiple(鸽巢原理)

    Description The input contains N natural (i.e. positive integer) numbers ( N <= ). Each of that n ...

随机推荐

  1. Mybatis表关联一对多

    有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如:最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.前面几篇教程中介绍的都是单表映射的一 ...

  2. windows下mysql密码忘了怎么办?【转】

    前两天在windows的command命令行下,用mysqladmin导入过一些站上数据 结果悲催了,mysql.user的内容被改了,root上不了了,权限也变了. 结合了网络上的集中方法,终于成了 ...

  3. 详解SQLServer如何链接远程MySQL数据库

    最近遇到“SQL如何链接远程MySQL”这个问题,现在问题终于解决,特把方法贴出来:(我所用的操作系统是Win7,数据库是SQL2005.) 1.在SQL SERVER服务器上安装MYSQL ODBC ...

  4. OpenStack Keystone架构

    一. Keystone简介 1. OpenStack Keystone简介 2. Keystone安装与部署 2.1 包安装Keystone 2.2 源码安装源码安装 3 配置运行Keystone 3 ...

  5. AFNetWorking能做什么

    AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其它方法为基础的. 以下这个样例是用来处理json请求的: NSURL *url = ...

  6. C#绘制数字图像灰度直方图

    灰度直方图是灰度的函数,描述的是图像中具有该灰度级的像素的个数.如果用直角坐标系来表示,则它的横坐标是灰度级,纵坐标是该灰度出现的概率(像素的个数). 灰度直方图的分布函数: 其中,K是指第k个灰度级 ...

  7. win10 .net framework 3.5无法安装错误代码0x800F081F

    复制链接:http://download.windowsupdate.com/d/msdownload/update/software/updt/2015/11/microsoft-windows-n ...

  8. linux drwxr-xr-x 是什么意思

    linux drwxr-xr-x 第一位表示文件类型.d是目录文件,l是链接文件,-是普通文件,p是管道 第2-4位表示这个文件的属主拥有的权限,r是读,w是写,x是执行. 第5-7位表示和这个文件属 ...

  9. mysql 中 时间和日期函数

    From: http://www.cnblogs.com/redfox241/archive/2009/07/23/1529092.html 一.MySQL 获得当前日期时间 函数 1.1 获得当前日 ...

  10. 【WP8】富文本功能实现

    2014年8月1日更新:修复如果有多个相同链接解析失败的Bug,谢谢 @Walsh 提供的问题 富文本在移动APP上应用的最多的就是表情了,类似微博,QQ,微信都有对提供对表情和链接的支持,富文本一般 ...