codeforces_346A Alice and Bob(数学)
题目链接:http://codeforces.com/problemset/problem/346/A
参考链接:http://blog.csdn.net/loy_184548/article/details/50174615
感受到数学在博弈论中的强大。
考虑最后终止状态的序列-无法取出任意两个数他们的差值不存在这个序列中:那么这必定是个首项等于公差的等差序列
而这个序列是 d 2d 3d....,因此可以通过a[1] a[2] a[3] ...的最大公约数得到
然后计算有几个数没在数组中,判断奇偶性即可
代码:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 #include <set> 8 using namespace std; 9 int a[105]; 10 11 int gcd(int x, int y){ 12 return x == 0? y : gcd(y % x, x); 13 } 14 15 int main(){ 16 int n, maxn = 0; 17 scanf("%d", &n); 18 for(int i = 0; i < n; i++){ 19 scanf("%d", &a[i]); 20 maxn = max(a[i], maxn); 21 } 22 int cnt = 0; 23 int g = a[0]; 24 for(int i = 1; i < n; i++){ 25 g = gcd(a[i], g); 26 } 27 cnt = maxn / g; 28 for(int i = 0; i < n; i++){ 29 if(a[i] % g == 0) cnt--; 30 } 31 if(cnt & 1){ 32 printf("Alice\n"); 33 } 34 else{ 35 printf("Bob\n"); 36 } 37 }
题目: