URAL 1032抽屉原理(鸽巢原理)
2017-11-03 23:13
330 查看
题意是给你n个数,让你在其中选择出few个数,few大于等于1小于等于n,让其和能整出n。一开始,考虑到给出的n的范围比较大,有10000,又有可能选择不连续的数字,可能有n的阶乘中可能性,后来在比赛结束之后,别人说是抽屉定理,于是查了查抽屉定理,大意是,如果有n+1个物品,有n个抽屉,必然有一个抽屉有>=2个物品,一开始觉得和这道题毫无关系啊,但是后来经过别人提醒,终于明白了,我们设立一个B数组,
B[i]=A[1]+A[2]+….A[i];
这样,设B[0]=0;
B[0]到B
一共有n+1个数,我们让所有的B数组都余n,这样就相当于B[0]到B
的每一个数只有0到n-1中可能,也就是说,n+1个数字,他们每一个的值只有n种可能,那么,必然至少有一个数字是重复出现的,也就是说B[i]=B[j];也就是说i+1到j的和肯定是n的倍数。
题目链接:https://vjudge.net/problem/URAL-1032
B[i]=A[1]+A[2]+….A[i];
这样,设B[0]=0;
B[0]到B
一共有n+1个数,我们让所有的B数组都余n,这样就相当于B[0]到B
的每一个数只有0到n-1中可能,也就是说,n+1个数字,他们每一个的值只有n种可能,那么,必然至少有一个数字是重复出现的,也就是说B[i]=B[j];也就是说i+1到j的和肯定是n的倍数。
题目链接:https://vjudge.net/problem/URAL-1032
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <stack> using namespace std; int n,t; const int maxn=15000; int A[maxn]; int sum[maxn]; int main() { scanf("%d",&n); bool flag=false; sum[0]=0; int x; for(int i=1;i<=n;i++) { scanf("%d",&A[i]); sum[i]=sum[i-1]+A[i]; if(A[i]%n==0) {flag=1;x=A[i];} } if(flag) { printf("1\n"); printf("%d\n",x); } else{ for(int i=0;i<=n;i++) { int s=sum[i]%n; for(int j=i+1;j<=n;j++) { if(sum[j]%n==s) { flag=true; printf("%d\n",j-i); for(int k=i+1;k<=j;k++) printf("%d\n",A[k]); break; } } if(flag) break; } if(!flag) printf("0\n"); } return 0; }
相关文章推荐
- ural 1032 鸽巢原理
- URAL 1032 Find a Multiple 鸽巢原理
- URAL - 1032 Find a Multiple 前缀和利用+鸽巢原理
- ural 1032 Find a Multiple (鸽巢原理)
- URAL 1032 A - Find a Multiple——抽屉原理+构造
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
- URAL 1032 Find a Multiple
- HDU 5776 SUM (鸽巢原理 / 抽屉原理)
- 抽屉原理( 鸽巢原理、重叠原理、狄利克雷)笔记记录
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
- 鸽巢原理(抽屉原理)
- ACM数论之旅14---抽屉原理,鸽巢原理,球盒原理(叫法不一又有什么关系呢╮(╯▽╰)╭)
- Ural1032 (雀巢原理)
- ural 1032 Find a Multiple
- 鸽巢原理(The Pigeonhole Principle)(抽屉原理)
- POJ2356 Find a multiple 抽屉原理(鸽巢原理)
- POJ2356 Find a multiple 抽屉原理(鸽巢原理)
- Codeforces 577B,鸽巢原理(抽屉原理)
- POJ 2356 Find a multiple(鸽巢原理(抽屉原理))
- URAL 1032 Find a Multiple