您的位置:首页 > 其它

poj 2356 Find a multiple(组合数学:鸽巢原理)

2014-08-20 22:17 323 查看
和poj 3370很像, 但这里只有一个n且对应n个数

根据鸽巢原理是应该存在一个i对应前i项和模n==0

但是题目中说了这n个数可以相同,所以可能存在不等于0的情况

比如:

5

1 5 5 5 5

但此时必然sum%n有重复

同poj 3370一样输出相同两数对应下标之间的数即可

代码如下:

#include <cstdio>
#include <cstring>
#define MAXN 100100
using namespace std;

int flag[MAXN];
int a[MAXN];

int main(void) {
int n, c, sum, tmp;
while(scanf("%d", &n) != EOF) {
sum = 0;
memset(flag, 0, sizeof(flag));
for(int i=1; i<=n; ++i) {
scanf("%d", &a[i]);
}
for(int i=1; i<=n; ++i) {
sum += a[i];
tmp = sum%n;
sum %= n;
if(tmp == 0) {
printf("%d\n%d\n", i, a[1]);
for(int j=2; j<=i; ++j)
printf("%d\n", a[j]);
break;
} else {
if(flag[tmp]) {
printf("%d\n%d\n", i-flag[tmp], a[flag[tmp]+1]);
for(int j=flag[tmp]+2; j<=i; ++j)
printf("%d\n", a[j]);
break;
}
}
flag[tmp] = i;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: