1. 程式人生 > >POJ--2356 Find a multiple

POJ--2356 Find a multiple

tdi 之間 this bit different 不存在 iat ems oos

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

5
1
2
3
4
1

Sample Output

2
2
3

Source

Ural Collegiate Programming Contest 1999

題目大意就是先給出一個數N,接著再給出N個數,要你從這N個數中任意選擇1個或多個數,使得其和是N的倍數

如果找不到這樣的答案 則輸出0

答案可能有多個,但智勇任意輸出一個解就行。

輸出的第一行是選擇元素的個數M,接著M行分別是選擇的元素的值

剛開始的時候並不同為什麽這一題回事抽屜原理,分析後才明白,昨晚後更有體會

實際上此題一定有解,不存在輸出0的結果

證明如下

我們可以依次求出a[0],a[0]+a[1],a[0]+a[1]+a[2],......,a[0]+a[1]+a[2]...+a[n];

假設分別是sum[0],sum[1],sum[2],......,sum[n]

如果在某一項存在是N的倍數,則很好解,即可直接從第一項開始直接輸出答案

但如果不存在,則sum[i]%N的值必定在[1,N-1]之間,又由於有n項sum,有抽屜原理:

 把多於n個的物體放到n個抽屜裏,則至少有一個抽屜裏有2個或2個以上的物體。

則必定有一對i,j,使得sum[i]=sum[j],其中i!=j,不妨設j>i

則(sum[j]-sum[i])%N=0,故sum[j]-sum[i]是N的倍數

則只要輸出從i+1~j的所有的a的值就是答案

然後就利用這個思路就可以直接的解出該題的答案

代碼:2種情況,滿足一種即可

 1 #include<cstdio> 
 2 #include<cstdlib> //沒有這個用c寫怎麽是Compile Error?
 3 int num[10000+10];  
 4 int sum[10000+10];  
 5 int main()  
 6 {  
 7     int i,j,k,n;  
 8     while(scanf("%d",&n)!=EOF){  
 9         sum[0]=0;int pos=0;  
10         for(i=1;i<=n;++i){  
11             scanf("%d",&num[i]);  
12             sum[i]=(sum[i-1]+num[i])%n;  //每次用余數和num[i]相加,我寫的是直接找和相加,錯了n次...
13             if(sum[i]==0)pos=i;  
14         }  
15         if(pos){  
16             printf("%d\n",pos);  
17             for(i=1;i<=pos;++i){  
18                 printf("%d\n",num[i]);  
19             }  
20         }  
21         else {  
22             for(i=1;i<=n;++i){  
23                 for(j=1;j<i;++j){  
24                     if(sum[i]-sum[j]==0)break;  
25                 }  
26                 if(j<i)break;  
27             }  
28             printf("%d\n",i-j);  
29             for(int k=j+1;k<=i;++k){  
30                 printf("%d\n",num[k]);  
31             }  
32         }  
33     }  
34     return 0;  
35 }  

POJ--2356 Find a multiple