POJ 2356 Find a multiple (鸽巢原理)
2013-02-04 13:50
387 查看
题目大意:给定n个数的集合,从中找出一些数使得他们的和可以被n整除.
离散数学课上老师讲过的竟然忘了= =……
假定n个数为a1,a2,...,an,前n项和分别是S1、S2、...、Sn,那么如果有一个Si模n是0,就是答案,否则,n个数模n的余数只能在 1到n - 1之间,把余数作为抽屉,显然n个数放到n - 1个抽屉里面,肯定有两个数余数相等,这样取它们的差就得到了结果,算法复杂度是O(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; }
相关文章推荐
- poj 2356 Find a multiple 鸽巢原理的简单应用
- Find a multiple (POJ - 2356 )(鸽巢原理)
- poj 2356 Find a multiple(鸽巢原理)
- POJ2356 Find a multiple【鸽巢原理】
- POJ 2356 Find a multiple (鸽巢原理)
- poj 2356 Find a multiple——鸽巢原理
- POJ 2356 Find a multiple【鸽巢原理】
- poj2356 Find a multiple(鸽巢原理)
- POJ 2356 Find a multiple 鸽巢原理
- POJ 题目2356 Find a multiple(鸽巢原理)
- POJ 2356 Find a multiple(鸽巢原理(抽屉原理))
- Find a multiple POJ - 2356 鸽巢原理
- poj 2356 Find a multiple(鸽巢原理+标记)
- poj2356 Find a multiple(鸽巢原理)
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
- POJ 2356 Find a multiple 鸽巢原理pigeon hole题解
- POJ 2356 Find a multiple 鸽巢原理
- POJ-2356 Find a multiple(鸽巢原理)题目数据太垃圾了!!
- poj 2356 Find a multiple(鸽巢原理)
- POJ 2356 Find a multiple(鸽巢原理)