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;
}

  

你可能感兴趣的:(find)