博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2356 Find a multiple(鸽巢原理)
阅读量:6323 次
发布时间:2019-06-22

本文共 2381 字,大约阅读时间需要 7 分钟。

Description

The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each of that numbers is not greater than 15000. This numbers are not necessarily different (so it may happen that two or more of them will be equal). Your task is to choose a few of given numbers ( 1 <= few <= N ) so that the sum of chosen numbers is multiple for N (i.e. N * k = (sum of chosen numbers) for some natural number k).

 

Input

The first line of the input contains the single number N. Each of next N lines contains one number from the given set.

 

Output

In case your program decides that the target set of numbers can not be found it should print to the output the single number 0. Otherwise it should print the number of the chosen numbers in the first line followed by the chosen numbers themselves (on a separate line each) in arbitrary order. If there are more than one set of numbers with required properties you should print to the output only one (preferably your favorite) of them.

 

Sample Input

512341

 

Sample Output

223

 

Source

 

题意:有n个数,求是否存在一些数的和是n的倍数。若存在,输出即可。不存在,输出0.

思路:鸽巢原理的题目,组合数学课本上的原题。可以把和求出来,然后对n取余,因为有n个和,对n取余,如果余数中没有出现0,根据鸽巢原理,一定有两个数的余数相同,两个和想减就是n的倍数。如果余数出现0,自然就是n的倍数。也就是说,n个数中一定存在一些数的和是n的倍数。求余输出即可。

 

1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 using namespace std;15 #define max(a,b) (a) > (b) ? (a) : (b) 16 #define min(a,b) (a) < (b) ? (a) : (b)17 #define ll long long18 #define eps 1e-1019 #define MOD 100000000720 #define N 1000621 #define inf 1e1222 int n;23 int sum[N];24 int vis[N];25 int a[N];26 int tmp[N];27 int main()28 {29 while(scanf("%d",&n)==1){30 memset(sum,0,sizeof(sum));31 for(int i=1;i<=n;i++){32 //int x;33 scanf("%d",&a[i]);34 sum[i]=sum[i-1]+a[i];35 }36 memset(vis,0,sizeof(vis));37 memset(tmp,0,sizeof(tmp));38 for(int i=1;i<=n;i++){39 int x=sum[i]%n;40 if(vis[x]){41 int y=tmp[x];42 printf("%d\n",i-y);43 for(int j=y+1;j<=i;j++){44 printf("%d\n",a[j]);45 }46 break;47 48 }49 if(x==0){50 printf("%d\n",i);51 for(int j=1;j<=i;j++){52 printf("%d\n",a[j]);53 }54 break;55 }56 vis[x]=1;57 tmp[x]=i;58 }59 60 }61 return 0;62 }
View Code

 

转载地址:http://dxlaa.baihongyu.com/

你可能感兴趣的文章
百思不得姐 one day
查看>>
19.04.16--指针笔记-参数传递
查看>>
面向对象
查看>>
POJ1860 Currency Exchange
查看>>
CNN 那么多的网络有什么区别吗?看这里了解 CNN 的发展历程
查看>>
多云中如何共享责任模式
查看>>
Adenium约旦57MW太阳能光伏项目投产
查看>>
《Servlet和JSP学习指南》一3.6 动作
查看>>
物联网市场FD-SOI制程会取代FinFET吗?
查看>>
《VMware、Citrix和Microsoft虚拟化技术详解与应用实践》一2.2 ESXi简介
查看>>
CSS3中linear-gradient实现百分比进度条
查看>>
Java设计模式精讲
查看>>
数据库索引为什么用B+树实现?
查看>>
Gensim训练维基百科语料库
查看>>
iOS 10.3应用内更换icon
查看>>
全局光照---光子映射
查看>>
支持向量机---线性支持向量机与软间隔最大化
查看>>
puppet自动化管理工具学习之文件
查看>>
Ubuntu安装RPM格式软件包
查看>>
SQL Server中的临时表和表变量 Declare @Tablename Table【转】
查看>>