poj 2356 Find a multiple——鸽巢原理
由于这个题是spj,所以只要在连续的里面找就可以了。
开一个sum数组,sum[i]记录前i个数的和。如果sum[i]%n==0,那么直接用这i个数就可以了。如果没有等于零的,由于n的最小非负剩余系除去零有n-1个数,而sum总共有n个位置,那么一定有最少两个sum的值是一样的
a27400 | 2356 | Accepted | 284K | 47MS | C++ | 812B | 2011-09-10 18:31:22 |
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
int a[10010];
int visit[10010];
int sum[10010];
void print(int i,int j)
{
// printf("ij:%d %d\n",i,j);
printf("%d\n",j-i+1);
int k;
for(k=i;k<=j;k++)
{
printf("%d\n",a[k]);
}
return ;
}
int main(void)
{
int n;
while(scanf("%d",&n)==1)
{
memset(a,0,sizeof(a));
memset(visit,0,sizeof(visit));
memset(sum,0,sizeof(sum));
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]+=(sum[i-1]+a[i])%n;
}
for(i=1;i<=n;i++)
{
if(sum[i]==0)
{
print(1,i);
break;
}
else
{
if(visit[sum[i]])
{
print(visit[sum[i]]+1,i);
break;
}
else
{
visit[sum[i]]=i;
}
}
}
}
return 0;
}