• 最大化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);
    } 
  • 相关阅读:
    docker 管理应用程序数据和网络管理
    docker安装和基本命令
    Jenkins
    Ansible批量自动化管理工具 roles标准化
    git分布式版本管理系统
    zabbix监控nginx+php-fpm,mysql+主从复制+高可用,tomcat,redis web状态
    zabbix*邮件报警 *用户参数User parameters *定义key值 *Agentd主动模式与被动模式
    修改mvc5的视图模板
    centOS安装Ftp
    重置Mysql自增列的开始序号
  • 原文地址:https://www.cnblogs.com/lipu123/p/14286876.html
Copyright © 2020-2023  润新知