zoukankan      html  css  js  c++  java
  • 【Aizu2968】Non-trivial Common Divisor

    题目链接

    Non-trivial Common Divisor

    题目描述

    You are given a positive integer sequence (A) of length (N). You can remove any numbers from the sequence to make the sequence “friendly". A sequence is called friendly if there exists an integer (k) (>1) such that every number in the sequence is a multiple of (k). Since the empty sequence is friendly, it is guaranteed that you can make the initial sequence friendly.

    You noticed that there may be multiple ways to make the sequence friendly. So you decide to maximize the sum of all the numbers in the friendly sequence. Please calculate the maximum sum of the all numbers in the friendly sequence which can be obtained from the initial sequence.

    输入格式

    The input consists of a single test case formatted as follows.
    (N) (A_1) (vdots) (A_N)
    The first line consists of a single integer (N) ((1 le N le 1000)). The (i+1)-st line consists of an integer (A_i) ((1 le A_i le 10^9) for (1 le i le N)).

    输出格式

    Print the maximum sum of all the numbers in the friendly sequence which can be obtained from the initial sequence.

    样例输入输出

    Input Output
    6
    1
    2
    3
    4
    5
    6
    12
    3
    173
    1733
    111733
    111733
    4
    1
    1
    1
    1
    0
    10
    999999999
    999999999
    999999999
    999999999
    999999999
    999999999
    999999999
    999999999
    999999999
    999999999
    9999999990
    1
    999999999
    999999999
    10
    28851
    8842
    9535
    2311
    25337
    26467
    12720
    10561
    8892
    6435
    56898

    题解

    题意:有(N)个数,从中选出(k)个数,使这些数有除(1)以外的公约数,求这(k)个数的和最大为多少。
    我们考虑到一个数的因数是“对称”的。
    那么,假设最大的数为(a)我们只要枚举公约数到(sqrt{a})
    但是我们会发现这么枚举,如果所有的数都是质数,那么答案的公约数肯定没有被枚举到,那么我们再枚举所有的数本身为公约数就好了。
    ps:结尾不换行会PE
    上代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int a[1009];
    bool p[40009];
    int x[40009],lx;
    long long ans;
    bool cmp(int x,int y){return x<y;}
    void pd(int x){
        if(x==1) return;
        long long sum=0;
        for(int j=1;j<=n;j++)
            if(a[j]%x==0) sum+=a[j];
        ans=max(ans,sum);
    }
    int main(){
        scanf("%d",&n);
        for(int j=1;j<=n;j++)
            scanf("%d",&a[j]);
        sort(a+1,a+n+1,cmp);
        for(int j=2;j*j<=a[n];j++){
            if(p[j]==0){
                x[++lx]=j;
                pd(j);
            }
            for(int i=1;i<=lx;i++){
                if(j*x[i]>40000) continue;
                p[j*x[i]]=1;
                if(j%x[i]==0) break;
            }
        }
        for(int j=1;j<=n;j++)
            pd(a[j]);
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    【函数】wm_concat包的订制
    【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
    【技巧】如何使用客户端发布BLOG+如何快速发布微信公众号文章
    【故障处理】队列等待之TX
    【转载】TX
    【转载】Linux磁盘管理:LVM逻辑卷管理
    【索引】Oracle之不可见索引和虚拟索引的比对
    小麦苗微信公众号文章链接地址
    Oracle 11g新特性direct path read引发的系统停运故障诊断处理
    常识之外:全表扫描为何产生大量 db file sequential read 单块读?
  • 原文地址:https://www.cnblogs.com/linjiale/p/13478647.html
Copyright © 2011-2022 走看看