备战Noip2018模拟赛11(B组)T2 Gcd 最大公约数
程序员文章站
2022-03-14 23:47:50
...
10月27日备战Noip2018模拟赛11(B组)
T2 Gcd最大公约数
题目描述
今天是8.17,小ž为了给长者庆祝生日拿来了Ñ个数字一个[1],A [2] ...一个[N]。
求最大值{GCD(A [1],A [j])}(I!= j)的。
输入格式
第一行一个整数ñ。
之后一行Ñ个正整数,表示一个[1],A [2] ...一个[N]。
输出格式
输出一个整数表示答案
输入样例
3
4 3 6
输出样例
3
数据范围
对于30%的数据,满足2≤n≤1000;
对于100%的数据,满足2≤n≤10000,1≤a[I]≤10^ 6。
思路
1.暴力,一个一个的比较求最大公约数,但这样是肯定会tle的了
2.所以可以先把每个数的所有公约数都求出来,用一个b []数组来记录,比如x为一个因数,那么++ b [x],(类似于桶排)
代码
#include <iostream>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 1000005;
int n, maxx = 0;
int a[MAXN], b[MAXN];
inline int read ();
int main ()
{
freopen ("gcd.in", "r", stdin);
freopen ("gcd.out", "w", stdout);
memset (b, 0, sizeof (b));
n = read ();
for (int i = 1; i <= n; ++ i){
a[i] = read ();
maxx = max (maxx, a[i]);
int j = 1;
while (j * j <= a[i]){ // 求每个数的因数
if (a[i] % j == 0){
++ b[j];
++ b[a[i] / j]; //如果j是因数, 那么a[i] / j 也一定是
}
if (j * j == a[i]) -- b[j]; //如果j^2 == a[i], 那么j = a[i] / j,有一次重复计数
++ j;
}
}
for (int i = maxx; i > 0; -- i){
if (b[i] >= 2){
printf ("%d", i);
break;
}
}
fclose (stdin);
fclose (stdout);
return 0;
}
inline int read ()
{
char ch = getchar ();
int f = 1;
while (!isdigit (ch)){
if (ch == '-') f = -1;
ch = getchar ();
}
int x = 0;
while (isdigit (ch)){
x = 10 * x + ch - '0';
ch = getchar ();
}
return x * f;
}
下一篇: jsp session