Problem Description
给出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
输出两两之间最大公约数的最大值。
Examples
Input |
|
Output |
5 |
思路:
如果用O(n^2)直接暴力,肯定超时。所以有技巧一下。
我们可以暴力分解每一个数的全部因子,记录下因子出现的次数>=2的最大音字即为所求答案。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[N];
int cnt[N*10];
int ans=0;
void solve(int n)
{
for(int i=1; i*i<=n; i++)
{
if(n%i==0)
{
cnt[i]++;
if(cnt[i]>=2)
ans=max(i,ans);
if(n/i!=i)
{
cnt[n/i]++;
if(cnt[n/i]>=2)
ans=max(n/i,ans);
}
}
}
}
int main()
{
int n,m;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
solve(a[i]);
}
cout<<ans<<endl;
return 0;
}