Problem:
给你n(n<=100)个正数,每次从中取任意两个数,他们的差值如果在集合中没有就加入集合中,问最后集合中元素个数的奇偶性?
Analyse:
- 首先考虑只有两个数的情况,发现两个数x,y(x>y),可以观察到连续执行操作,可以生成的数的集合是
{k?gcd(x,y) | k=1,2,..且 k?gcd(x,y)<=y}
- 然后考虑有第三个数Z的情况,因为前面的两个数,极其生成的所有数的最大公约数都是gcd(x, y),
所以加入第三个数之后这个集合的新的最大公约数是gcd(gcd(x,y),Z),然后生成集合是以这个最大公约数的倍数来生成.
- ……..
- 归纳到n个数,就是以最大的数为上界,所有n个数的最大公约数来填充的集合,元素个数为:
max{xi | 1<=i<=n}gcd{x1,x2,...xn}.
/**********************jibancanyang**************************
*Author* :jibancanyang
*Created Time* : 二 5/10 10:57:35 2016
*File Name* : jy.cpp
**Code**:
***********************[email protected]**********************/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;
vector<int> vi;
#define pr(x) cout << #x << ": " << x << " "
#define pl(x) cout << #x << ": " << x << endl;
#define pri(a) printf("%d\n",(a));
#define xx first
#define yy second
#define sa(n) scanf("%d", &(n))
#define sal(n) scanf("%lld", &(n))
#define sai(n) scanf("%I64d", &(n))
#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++)
const int mod = int(1e9) + 7, INF = 0x3fffffff;
const int maxn = 1e5 + 13;
int gcd(int a, int b) {
if (!b) return a;
return gcd(b, a % b);
}
int main(void)
{
int n;
while (cin >> n) {
int x = 0;
cin >> x;
int g = x;
for (int i = 1; i < n; i++) {
int y; cin >> y;
x = max(y, x);
g = gcd(g, y);
}
if ( (x / g - n) % 2) cout << "Alice" << endl;
else cout << "Bob" << endl;
}
return 0;
}
时间: 2024-11-02 12:26:07