poj 3370 抽屉原理

同 上一题,错了两次,原因:100000*100000会超int

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 typedef __int64 lld;
4 lld sum[100010];
5 int mod[100010];
6 int re[100010];
7 int num[100010];
8 inline bool dig(char x){return x>='0'&&x<='9';}
9 int get_val()
10 {
11 int ret=0;
12 char c='';
13 do{
14 c=getchar();
15 }while(!dig(c));
16 do{
17 ret=ret*10+c-'0';
18 c=getchar();
19 }while(dig(c));
20 return ret;
21 }
22 int main()
23 {
24 int n,m,i,j;
25 while(scanf("%d%d",&n,&m),n||m)
26 {
27 sum[0]=0;
28 for(i=1;i<=m;i++)
29 {
30 //scanf("%d",&num[i]);
31 num[i]=get_val();
32 sum[i]=(sum[i-1]+num[i]);
33 mod[i]=sum[i]%n;
34 }
35 int flag=0;
36 memset(re,0,sizeof(re));
37 for(i=1;i<=m;i++)
38 {
39 re[mod[i]]++;
40 if(re[mod[i]]==2)
41 {
42 flag=2;
43 break;
44 }
45 if(mod[i]==0)
46 {
47 flag=1;
48 break;
49 }
50 }//printf("flag=%d\n",flag);
51 if(flag==1)
52 {
53 //printf("%d\n",i);
54 for(j=1;j<i;j++)
55 {
56 printf("%d ",j);
57 }
58 printf("%d\n",i);
59 }
60 else if(flag==2)
61
62 {
63 for(j=i-1;j>=1;j--)
64 {
65 if(mod[j]==mod[i])
66 break;
67 }
68 // printf("%d\n",i-j);
69 for(int k=j+1;k<i;k++)
70 {
71 printf("%d ",k);
72 }
73 printf("%d\n",i);
74 }
75 }
76 return 0;
77 }



posted @ 2011-10-30 16:28  Because Of You  Views(285)  Comments(0Edit  收藏  举报