20140926 【 初等数论 】 51nod 1179 . 最大的最大公约数

提一个问题
  徐华杰  向下
话题  数论  修改
1179 . 最大的最大公约数
题目来源:  SGU
基准时间限制:1 秒 空间限制:65536 KB 分值: 40
给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
Input
第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
Output
输出两两之间最大公约数的最大值。
Input 示例
4
9
15
25
16
Output 示例
5
如果你已经搞定了该问题,或许可以再看看:
最小公倍数LCM分值: 5
最大公约数GCD分值: 0
最小公倍数计数分值: 1280
最大公约数之和 V2分值: 160
最小公倍数之和分值: 160
最大公约数之和分值: 80
最小公倍数之和 V3分值: 640
最大公约数之和 V3分值: 640
最小公倍数之和 V2分值: 320
请选择语言:     允许其他 AC 的用户查看我的代码
编号 相关问题 分值
1003阶乘后面0的数量 5
1192Gcd表中的质数 320
1216Nod Number 640
1221矩阵中不重复的元素 V4 2560
1222最小公倍数计数 1280









此题暴力肯定超时。


但是由于 数据 < 10000000;


可以开一个数组,标记每个数出现的次数。

接下来枚举 2的倍数,3的倍数...n的倍数。(当然)

当出现 a[x1*k] = 1 && a[x2*k] = 1;

即说明有两个数,使得 k 是这两个数的约数。


于是,由此更新满足此条件的 k 的值,就是最大的最大公约数。


至于时间复杂度,了解《埃拉托斯特尼筛法》的同学肯定清楚;

是 n*log(n) 的时间复杂度。





#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 1e6 + 10;

LL gcd(LL a, LL b){
    return b ? gcd(b, a%b) : a;
}

int n;
LL a[MAXN], x;

int main(){
    while( EOF != scanf("%lld", &n) ){
        memset(a, 0, sizeof(a));
        LL maxx = 0, ans = 0;
        for(int i=0; i<n; i++){
            scanf("%lld", &x);
            a[x]++;
            if( x>maxx )    maxx = x;
        }
        for(int i=2; i<=maxx; i++){
            int sum = 0;
            for(int j=i; j<=maxx; j+=i){
                sum += a[j];
                if( sum>1 ) break;
            }
            if( sum>1 ) ans = max(ans, (LL)i);
        }
        printf("%lld\n", ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值