POJ 2356 Find a multiple 鸽巢原理
2014-08-02 18:33
323 查看
题目来源:POJ 2356 Find a multiple
题意:n个数 选出任意个数 使得这些数的和是n的倍数
思路:肯定有解 并且解是连续的一段数
证明:
假设有m个数 a1,a2,a3...am s1 s2 s3...sm为前缀和 s1 = a1 s2 = a1+a2 s3 = a1+a2+a3... sm = a1+a2+a3+...+am
1.如果某个前缀和si%m == 0 那么得到解
2.设x1=s1%m x2 = s2%m x3 = s3%m xm = sm%m
因为1不成立 所以xi > 1 && xi < m 由鸽巢原理的必定存在一对i j 使得xi == xj 得到解
题意:n个数 选出任意个数 使得这些数的和是n的倍数
思路:肯定有解 并且解是连续的一段数
证明:
假设有m个数 a1,a2,a3...am s1 s2 s3...sm为前缀和 s1 = a1 s2 = a1+a2 s3 = a1+a2+a3... sm = a1+a2+a3+...+am
1.如果某个前缀和si%m == 0 那么得到解
2.设x1=s1%m x2 = s2%m x3 = s3%m xm = sm%m
因为1不成立 所以xi > 1 && xi < m 由鸽巢原理的必定存在一对i j 使得xi == xj 得到解
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int maxn = 105010; int a[maxn]; int b[maxn]; int c[maxn]; int main() { int n, m; while(scanf("%d", &n) != EOF) { memset(b, 0, sizeof(b)); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); c[i] = a[i]; a[i] += a[i-1]; a[i] %= n; } for(int i = 1; i <= n; i++) { //c[i] += a[i-1]; if(a[i] == 0 || b[a[i]]) { int j = 1; if(b[a[i]]) j = b[a[i]]+1; printf("%d\n", i-j+1); for( ; j <= i; j++) { printf("%d\n", c[j]); } break; } b[a[i]] = i; } } return 0; }
相关文章推荐
- POJ 题目2356 Find a multiple(鸽巢原理)
- poj 2356 Find a multiple(鸽巢原理+标记)
- poj 2356 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 (鸽巢原理)
- POJ 2356 Find a multiple (鸽巢原理)
- poj 2356 Find a multiple[鸽巢原理]
- Find a multiple (POJ - 2356 )(鸽巢原理)
- poj 2356 Find a multiple(鸽巢原理)
- POJ 2356 Find a multiple【鸽巢原理】
- POJ 2356 Find a multiple(鸽巢原理)
- POJ 2356 find multiple 鸽巢原理
- 鸽巢原理:hdu 1205 吃糖果+poj 2356 Find a multiple+poj 3370 Halloween treats
- POJ-2356 Find a multiple(鸽巢原理)题目数据太垃圾了!!
- Find a multiple POJ - 2356 鸽巢原理
- POJ 2356 Find a multiple 鸽巢原理