POJ:2356 Find a multiple(鸽巢原理)
2014-01-18 22:07
465 查看
鸽巢原理。
开始只是胡乱蒙了一个结论写的,居然AC了,后来百度发现竟然是鸽巢原理。
/article/2008073.html
这个人写的很好,我摘抄一段。
a1,a2,a3...am是正整数序列,至少存在整数k和r,1<=k<r<=m,使得ak+a(k+1)+...+a(r)是m的倍数。
证明比较简单:
Sk表示前k个数之和,
(1)若Sk%m==0,前k个数就是m的倍数
(2)如果Sn与St模m同余,那么从t+1到n这些数之和模m等于0.
可知此题必定有解。
开始只是胡乱蒙了一个结论写的,居然AC了,后来百度发现竟然是鸽巢原理。
/article/2008073.html
这个人写的很好,我摘抄一段。
a1,a2,a3...am是正整数序列,至少存在整数k和r,1<=k<r<=m,使得ak+a(k+1)+...+a(r)是m的倍数。
证明比较简单:
Sk表示前k个数之和,
(1)若Sk%m==0,前k个数就是m的倍数
(2)如果Sn与St模m同余,那么从t+1到n这些数之和模m等于0.
可知此题必定有解。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define MAXN 100005 #define MOD 1000000007 #define INF 2139062143 #define ll long long using namespace std; int main() { int N; scanf("%d",&N); int arr[MAXN]; for(int i=0; i<N; ++i) scanf("%d",&arr[i]); int note[MAXN]; memset(note,-1,sizeof(note)); int sum=0; bool out=false; for(int i=0; i<N; ++i) { sum+=arr[i]%N; sum=sum%N; if(sum==0) { out=true; printf("%d\n",i+1); for(int j=0; j<=i; ++j) printf("%d\n",arr[j]); break; } else if(note[sum]!=-1) { out=true; printf("%d\n",i-note[sum]); for(int j=note[sum]+1; j<=i; ++j) printf("%d\n",arr[j]); break; } else note[sum]=i; } if(!out) printf("0\n"); return 0; }
相关文章推荐
- 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 (鸽巢原理)
- 鸽巢原理:hdu 1205 吃糖果+poj 2356 Find a multiple+poj 3370 Halloween treats
- POJ 2356 find 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【鸽巢原理】
- poj2356 Find a multiple(鸽巢原理)
- POJ 2356 Find a multiple (鸽巢原理)
- poj 2356 Find a multiple——鸽巢原理