摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
Greatest Greatest Common Divisor ★★☆☆☆ 答案正确 100 2015-2-21 16:21:27

(AC 680)

题意

给出n个数{a_i}中两两之间最大公约数之中最大的一个。

题解

  • 从max{a_i}到1枚举每个数k,分别判断是否存在a_ia_j使得a_i=m_1*ka_j=m_2*km_1,m_2为整数)。
  • 由于题目限定了a_i的范围,只需要枚举m,判断是否有两个m*k是否属于{a_i}即可(可以用数组统计出现次数)。
  • 容易知道复杂度为O(max\{a_i\})+O(\frac{max\{a_i\}}{2})+O(\frac{max\{a_i\}}{3})+...+O(1)=O(max\{a_i\}log(max\{a_i\}))

代码

499.cpp代码已折叠
展开折叠内容
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define si(n) scanf("%d",&n)
#define dsi(n) int n;si(n)
#define f(i,n) for(int i=1;i<=n;++i)
#define fi(i,p,n) for(int i=p;i<=n;++i)
#define fd(i,n) for(int i=n;i!=0;--i)
#define fdi(i,p,n) for(int i=n;i>=p;--i)
int countA[1000010]={},maxA=0;
int main()
{
    dsi(n);
    f(i,n)
    {
        dsi(a);
        ++countA[a];
        maxA=max(maxA,a);
    }
    fd(i,maxA)
        for(int j=1,o=0;i*j<=maxA;++j)
        {
            o+=countA[i*j];
            if(o>=2)
            {
                cout<<i<<endl;
                return 0;
            }
        }
}

参考资料和拓展阅读

著作权声明[编辑]

关于[编辑]