poj 2356 Find a multiple——ハトの巣の原理

8215 ワード

この問題はspjなので、連続した中で探せばいいです.
sum配列を開き、sum[i]は前のi個の数の和を記録する.sum[i]%n=0なら、このi個の数をそのまま使えばいいです.ゼロに等しくない場合、nの最小非負残留系はゼロを除いてn−1個の数を有し、sumは合計n個の位置を有するため、必ず最小2個の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
",i,j);

printf("%d
",j-i+1);
int k;
for(k=i;k<=j;k++)
{
printf(
"%d
",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;
}