1179 最大的最大公约数

  1. 1.0 秒
  2.  
  3. 131,072.0 KB
  4.  
  5. 20 分
  6.  
  7. ​3级题​

给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。

 收起

输入


第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)


输出


输出两两之间最大公约数的最大值。


输入样例


4 9 15 25 16


输出样例


5


 

这题真不难,但一开始想复杂了,以为会有一系列的公式推导和理论证明,但其实暴力分解每一个数的因子,记录一下因子的个数>=2的最大因子就为答案。

但这题有点无聊,卡内存

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
const ll N=500005;
ll gcd(ll a,ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a,ll b)
{
return a*b/gcd(a,b);
}
ll a[N];
int cnt[N*10];
ll ans=0;
void solve(ll n)
{
for(ll 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()
{
ll n,m;
scanf("%lld",&n);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
solve(a[i]);
}
printf("%lld",ans);

return 0;
}