您的位置:首页 > 其它

Codeforces Round #201 (Div. 2) C 数论

2016-05-10 11:44 495 查看
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**:
***********************1599664856@qq.com**********************/

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: