文章出处:http://www.cnblogs.com/heqinghui/archive/2013/07/12/3186088.html
题目出处:http://poj.org/problem?id=2356
解题思路:利用抽屉原理,把n个数求取n个和,第i个和为前i个数的和。在这n个和中必然存在,其中一个数是n的倍数或者其中两个数对n取模得到的值相等。两者必然存在一个。然后让两个和相减,就得到结果了。
其实推广下可以从n个数中找出其它n个不同的和,然后进行上述操作。为什么是n个和而不是原来的n个数,这个留给大家思考。个人觉得是,寻找的是n的倍数,这样的话可以保证,得到的结果是大于n的。
代码如下:
#include<iostream>
#include<cmath>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define maxn 16000
int a[maxn];
int sum[maxn];
int main()
{
int i,j,k,n,flag;
while(scanf("%d",&n)!=EOF)
{
flag=false;
sum[0]=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
{
sum[i] = (sum[i-1]+a[i])%n;
if(sum[i]==0)
{
printf("%d\n",i);
for(k=1;k<=i;k++)
printf("%d\n",a[k]);
break;
}
else
{
for(j=1;j<i;j++)
{
if(sum[i]==sum[j])
{
printf("%d\n",i-j);
for(k=j+1;k<=i;k++)
printf("%d\n",a[k]);
flag=true;
break;
}
}
}
if(flag)
break;
}
}
return 0;
}