POJ 2356 Find a multiple 鸽巢原理
2012-11-21 12:28
405 查看
Find a multiple
记sum[i] = (sum[i-1] + num[i])%N,显然对于sum[1...N]肯定会分布在0....N-1中,如果出现sum[i] = 0,显然我们已经找到了一组解;如果没有出现,也就是说sum[1...N]的值都分布在1....N-1中,N个数分布在1....N-1中,显然会出现sum[i] = sum[j], 其中i != j;这样我们就可以找到一组解。
记sum[i] = (sum[i-1] + num[i])%N,显然对于sum[1...N]肯定会分布在0....N-1中,如果出现sum[i] = 0,显然我们已经找到了一组解;如果没有出现,也就是说sum[1...N]的值都分布在1....N-1中,N个数分布在1....N-1中,显然会出现sum[i] = sum[j], 其中i != j;这样我们就可以找到一组解。
#include <cstdio> #include <cstring> const int maxn = 10005; int s[maxn]; int app[maxn]; int number[maxn]; int main(){ int n, i, flag = 0, begin, end; scanf("%d", &n); for(i = 1; i <= n; i ++){ int a; scanf("%d", &a); number[i] = a; s[i] = (s[i-1] + a)%n; if(s[i]==0){ begin = 1; end = i; break; } //这里不需要保存出现几次,只要保存这个值最先出现的下标 //当再次取模到这个点的时候,我们就直接找到了一组解 if(app[s[i]]==0){ app[s[i]] = i; } else{ begin = app[s[i]] + 1; end = i; break; } } printf("%d\n", end - begin + 1); while(begin <= end){ printf("%d\n", number[begin++]); } return 0; }
相关文章推荐
- poj 2356 Find a multiple 鸽巢原理的简单应用
- Find a multiple (POJ - 2356 )(鸽巢原理)
- POJ 2356 Find a multiple【鸽巢原理】
- poj 2356 Find a multiple(鸽巢原理)
- POJ2356 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(鸽巢原理)
- 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(鸽巢原理)
- POJ 2356 Find a multiple 鸽巢原理pigeon hole题解
- POJ 2356 Find a multiple(鸽巢原理)