poj 2356 简单抽屉原理
抽屉原理。。早就知道了,只是没有切过题,今天碰上了一道,果断刷掉
其实n个数一定可以找出一些数或某个数的和能被n整除
取sum[i]为前i个数的和,对n取余。
n个数对n取余,下面两个结论必有一个成立:有两个余数是相等的,有一个余数是1
其中任何一个结论的成立都表示存在一些数的和能被n整除
View Code
1 #include<stdio.h>
2 #include<string.h>
3 int sum[10010];
4 int mod[10010];
5 int re[10010];
6 int num[10010];
7 int main()
8 {
9 int n,i,j;
10 scanf("%d",&n);
11 sum[0]=0;
12 for(i=1;i<=n;i++)
13 {
14 scanf("%d",&num[i]);
15 sum[i]=(sum[i-1]+num[i]);
16 mod[i]=sum[i]%n;
17 }
18 int flag=0;
19 memset(re,0,sizeof(re));
20 for(i=1;i<=n;i++)
21 {
22 re[mod[i]]++;
23 if(re[mod[i]]==2)
24 {
25 flag=2;
26 break;
27 }
28 if(mod[i]==0)
29 {
30 flag=1;
31 break;
32 }
33 }//printf("flag=%d\n",flag);
34 if(flag==1)
35 {
36 printf("%d\n",i);
37 for(j=1;j<=i;j++)
38 {
39 printf("%d\n",num[j]);
40 }
41 }
42 else if(flag==2)
43 {
44 for(j=i-1;j>=1;j--)
45 {
46 if(mod[j]==mod[i])
47 break;
48 }
49 printf("%d\n",i-j);
50 for(int k=j+1;k<=i;k++)
51 {
52 printf("%d\n",num[k]);
53 }
54 }
55 return 0;
56 }