最大化k*g

小w最近仔细研究了公约数,他想到了以下问题:
现有n个正整数,从中选k2kn)个,设这k个数的最大公约数为g,则这k个数的价值为kg。求这个价值的最大值。
小w当然知道答案了。现在他想考考你,你能很快回答出来吗?

Input

第一行,一个整数nn。
第二行,nn个正整数。

Output

一行一个正整数,表示答案。

Samples

Input Copy
5
4 6 3 8 9
Output
9

Hint

【数据范围】

  • 对于30%数据,N100
  • 对于100%数据,N200000,输入第二行每个数字不超过2000000

Source

石光中学 2018泉州集训提高组day5

解析:这个题两个变量,可以先固定一个变量,就是先把每个数的因子处理出来;

但是要加读入挂,

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<iostream>
#include<algorithm>
/*
现有n个正整数,从中选k(2≤k≤n)个,
设这k个数的最大公约数为g,则这k个数的价值为k*g。求这个价值的最大值。
*/ 
using namespace std;
typedef long long ll; 
const int maxn=5e6+100;
struct ios {
    inline char gc(){
        static const int IN_LEN=1<<18|1;
        static char buf[IN_LEN],*s,*t;
        return (s==t)&&(t=(s=buf)+fread(buf,1,IN_LEN,stdin)),s==t?-1:*s++;
    }
    template <typename _Tp> inline ios & operator >> (_Tp&x){
        static char ch,sgn; ch = gc(), sgn = 0;
        for(;!isdigit(ch);ch=gc()){if(ch==-1)return *this;sgn|=ch=='-';}
        for(x=0;isdigit(ch);ch=gc())x=x*10+(ch^'0');
        sgn&&(x=-x); return *this;
    }
}io;
template <class T>
inline void out(T x) 
{ 
    if (x > 9) 
    {
        out(x / 10); 
    }
    putchar(x % 10 + '0');
}
int a[maxn];
int n;
int vis[maxn];
ll max(ll a,ll b){
    if(a>b){
        return a;
    }
    else{
        return b;
    } 
}
int main(){
    io>>n;
    for(register int i=1;i<=n;i++){
        io>>a[i];
    }
    sort(a+1,a+n+1);
    for(register int i=1;i<=n;i++){
        for(register int j=1;j*j<=a[i];j++){
            if(a[i]%j==0){
                vis[j]++;    
                if(j*j!=a[i]){
                    vis[a[i]/j]++;
                }
            }
            
        }
    }
    int p=a[n];
    ll ans=0;
    for(register int i=1;i<=p;i++){
        if(vis[i]>1){//如果是1的话,就是一个数,要两个以上的数才行
            ans=max(ans,1ll*i*vis[i]);
        }
    }
    out(ans);
} 
原文地址:https://www.cnblogs.com/lipu123/p/14286876.html