hdu1808-Halloween treats(抽屉原理)

题目大意:

给你两个整数C和N,再给你N个正数的序列,从中找到若干数,使得其和刚好是 C

的倍数。输出这些数的序号。


 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 int c,n,sum,t,j;
 6 int a[100005],f[100005];
 7 
 8 
 9 int main()
10 {
11     while(scanf("%d%d",&c,&n)&&(c!=0||n!=0))
12     {
13         sum=0;
14         memset(f,-1,sizeof(f));
15         for(int i=1;i<=n;i++)
16         {
17             scanf("%d",&a[i]);
18         }
19         for(int i=1;i<=n;i++)
20         {
21             sum+=a[i];
22             t=sum%c;
23             sum=sum%c;//减小运算
24 
25             if(t==0)
26             {
27                 for(j=1;j<i;j++)
28                 {
29                     printf("%d ",j);
30                 }
31                 printf("%d\n",j);
32                 break;
33             }
34              else if(f[t]!=-1)//当余数上一次循环存在时
35             {
36                 for(j=f[t]+1;j<i;j++)
37                     printf("%d ",j);
38                 printf("%d\n",j);
39                 break;
40             }
41             f[t]=i;//sum%c的位置i
42 
43         }
44     }
45 }

 

证明

 

posted @ 2018-04-14 18:20  Somnus、M  阅读(153)  评论(0编辑  收藏  举报