Codeforces-346A
2013-10-10 20:21
357 查看
题意:给出n个数的集合初始值,如果向集合添加一个数,该数是集合中任意两个数相减的绝对值且该数不等于任意原来集合中的数。两个轮流添加数。谁最后不能添加数就输了。
分析:从结果出发,如果该集合不能添加数,该集合必定形成一个等差数列且第一元素必定为d,公差d!=0;,而且我们可以发现,添加的数总是小于原来集合最大的数m;如果我们知道最后形成数列的公差d,那么集合的个数就可以确定。即G=m/d。再减去原来集合的个数n。剩下的新增加的元素个数,相当于轮流次数了。判断奇偶就得到结果了。问题在于怎样等到d。
这个让我想了很久。想想看,在这个集合中等差数列第一元素必定为d,那么所有的元素,一定能被公差d整除。只要gcd(a1,a2,a3....an) ,即等到d;
分析:从结果出发,如果该集合不能添加数,该集合必定形成一个等差数列且第一元素必定为d,公差d!=0;,而且我们可以发现,添加的数总是小于原来集合最大的数m;如果我们知道最后形成数列的公差d,那么集合的个数就可以确定。即G=m/d。再减去原来集合的个数n。剩下的新增加的元素个数,相当于轮流次数了。判断奇偶就得到结果了。问题在于怎样等到d。
这个让我想了很久。想想看,在这个集合中等差数列第一元素必定为d,那么所有的元素,一定能被公差d整除。只要gcd(a1,a2,a3....an) ,即等到d;
#include<iostream> #include<cstdio> #include<cstring> typedef __int64 LL; using namespace std ; LL gcd(LL x,LL y){ if(y==0) return x; return gcd(y,x%y); } int main() { int n; LL m,num,d; while(scanf("%d",&n)!=EOF){ m=d=0; for(int i=0;i<n;i++){ scanf("%I64d",&num); m=max(num,m); d=gcd(d,num); } if((m/d-n)%2)puts("Alice"); else puts("Bob"); } return 0 ; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- 组合数求模总结
- 整数对
- Leftmost Digit
- POJ 3292.Semi-prime H-numbers
- HDU 1133 (数论 or DP、高精度;Java版)
- zoj_3621 Factorial Problem in Base K
- zoj_1657 Goldbach's Conjecture
- zoj_1526 Big Number
- poj_3210 Coins
- poj_1528 Perfection
- poj_2262 Goldbach's Conjecture
- poj_2992 Divisors
- poj_3910 GCD Determinant
- hdu4704--sum--大数幂取模