您的位置:首页 > 其它

poj 2356 Find a multiple——鸽巢原理

2011-09-10 20:55 369 查看
由于这个题是spj,所以只要在连续的里面找就可以了。

开一个sum数组,sum[i]记录前i个数的和。如果sum[i]%n==0,那么直接用这i个数就可以了。如果没有等于零的,由于n的最小非负剩余系除去零有n-1个数,而sum总共有n个位置,那么一定有最少两个sum的值是一样的

a274002356Accepted284K47MSC++812B2011-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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: