当前位置: 代码迷 >> 综合 >> 51nod 1179 最大的最大公约数 暴力出奇迹
  详细解决方案

51nod 1179 最大的最大公约数 暴力出奇迹

热度:44   发布时间:2024-01-15 06:30:28.0

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;
}