您的位置:首页 > 其它

POJ 2356 Find a multiple (鸽巢原理)

2013-02-04 13:50 323 查看
题目大意:给定n个数的集合,从中找出一些数使得他们的和可以被n整除.

离散数学课上老师讲过的竟然忘了= =……

假定n个数为a1,a2,...,an,前n项和分别是S1、S2、...、Sn,那么如果有一个Si模n是0,就是答案,否则,n个数模n的余数只能在 1到n - 1之间,把余数作为抽屉,显然n个数放到n - 1个抽屉里面,肯定有两个数余数相等,这样取它们的差就得到了结果,算法复杂度是O(n)的。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MID(x,y) ((x+y)>>1)
using namespace std;
typedef long long LL;
int a[10010], sum[10010], vis[10010];
int main(){
int n;
cin >> n;
for (int i = 0; i < n; i ++){
cin >> a[i];
if (i == 0){
sum[i] = a[i] % n;
continue;
}
sum[i] = (sum[i-1] + a[i]) % n;
}
memset(vis, -1, sizeof(vis));
for (int i = 0 ; i < n; i ++){
if (sum[i] == 0){
cout << i + 1 << endl;
for (int j = 0; j <= i; j ++)
cout << a[j] << endl;
break;
}
else{
if (vis[sum[i]] != -1){
cout << i - vis[sum[i]] << endl;
for (int j = vis[sum[i]] + 1; j <= i; j ++)
cout << a[j] << endl;
break;
}
else{
vis[sum[i]] = i;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: