poj 2356 抽屉原理

基本原理: 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 }
View Code
原文地址:https://www.cnblogs.com/TreeDream/p/7028229.html