https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1103
抽屉原理 一直觉得没什么用 今天被教做人了。。
假设有n-1个抽屉 n个球 至少有一个抽屉会放至少两个球
先求模n前缀和 看是否有0 没有的话就要用到抽屉原理
原本模n意义下 前缀和有n个取值 因为没有0 则只有n-1个 由抽屉原理的 至少有两个前缀和模n相等 中间的一段即为所求
#include <bits/stdc++.h>
using namespace std;
const int maxn=50010;
int ary[maxn],pre[maxn],book[maxn];
int n;
int main()
{
int i,j,flag;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&ary[i]);
for(i=1;i<=n;i++) pre[i]=(ary[i]+pre[i-1])%n;
flag=0;
for(i=1;i<=n;i++)
{
if(pre[i]==0)
{
flag=1;
printf("%d\n",i);
for(j=1;j<=i;j++) printf("%d\n",ary[j]);
}
}
if(!flag)
{
for(i=1;i<=n;i++)
{
if(book[pre[i]])
{
printf("%d\n",i-book[pre[i]]);
for(j=book[pre[i]]+1;j<=i;j++) printf("%d\n",ary[j]);
break;
}
book[pre[i]]=i;
}
}
return 0;
}