1179 最大的最大公约数
- 1.0 秒
- 131,072.0 KB
- 20 分
- 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;
}