基本原理: n+1个鸽子放到n个笼子里,至少有一个笼子里有两只及其以上的鸽子。若有n个笼子,kn+1个鸽子,至少有一个笼子里面有k+1个鸽子;
题意:给定N个数,挑出一些数,他们和和是n的整数倍;
分析:
对前缀和%n,余数为1~n,(0满足)相等处则产生解;
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 6 using namespace std; 7 8 const int maxn = 10000 + 5; 9 10 int sum[maxn],a[maxn],has[maxn]; 11 int n; 12 int main() 13 { 14 scanf("%d",&n); 15 memset(has,-1,sizeof(has)); 16 has[0]=0; 17 int l,r; 18 for(int i=1;i<=n;i++) 19 { 20 scanf("%d",&a[i]); 21 sum[i]=(sum[i-1]+a[i])%n; 22 if(has[sum[i]]==-1) 23 { 24 has[sum[i]]=i; 25 } 26 else 27 { 28 l=has[sum[i]]; 29 r=i; 30 } 31 } 32 printf("%d ",r-l); 33 for(int i=l+1;i<=r;i++) 34 { 35 printf("%d ",a[i]); 36 } 37 return 0; 38 }