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 |
编号 | 相关问题 | 分值 |
1003 | 阶乘后面0的数量 | 5 |
1192 | Gcd表中的质数 | 320 |
1216 | Nod 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;
}