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

Problem:
给你 n(n<=100) 个正数,每次从中取任意两个数,他们的差值如果在集合中没有就加入集合中,问最后集合中元素个数的奇偶性?
Analyse:

  • 首先考虑只有两个数的情况,发现两个数 x,y(x>y) ,可以观察到连续执行操作,可以生成的数的集合是
    {kgcd(x,y) | k=1,2,.. kgcd(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值