题目
思路
抽屉原理
现在我们想办法把n变成n个物品,n-1变成n-1个抽屉。
sum[i]表示(a[1]+…+a[i])%n取模,那么sum[i]中表示的数只能是0到n-1,如果是0就满足题意,如果不是0,那么根据抽屉原理sum[i]为n个数,1~n-1中必定存在两个数是相等的。
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define LL long long
const int maxn=10000+10;
int a[maxn];
int sum[maxn];
int has[maxn];
void init()
{
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
memset(has,-1,sizeof(has));
}
int main()
{
int n;
while(~scanf("%d",&n))
{
init();
has[0]=0;
int l,r;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
sum[i]=(a[i]+sum[i-1])%n;
if(has[sum[i]]==-1)
{
has[sum[i]]=i;
}
else
{
l=has[sum[i]];
r=i;
}
}
printf("%d\n",r-l);
for(int i=l+1; i<=r; i++)
{
printf("%d\n",a[i]);
}
printf("\n");
}
return 0;
}