51nod 1179 最大的最大公约数 暴力出奇迹
原创
©著作权归作者所有:来自51CTO博客作者mb5f5b1df7f1e34的原创作品,请联系作者获取转载授权,否则将追究法律责任
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;
}