zoukankan      html  css  js  c++  java
  • C. Enlarge GCD Codeforces Round #511 (Div. 2)【数学】

    题目:

    Mr. F has nn positive integers, a1,a2,,an.

    He thinks the greatest common divisor of these integers is too small. So he wants to enlarge it by removing some of the integers.

    But this problem is too simple for him, so he does not want to do it by himself. If you help him, he will give you some scores in reward.

    Your task is to calculate the minimum number of integers you need to remove so that the greatest common divisor of the remaining integers is bigger than that of all integers.

    Input

    The first line contains an integer nn (2n310^5) — the number of integers Mr. F has.

    The second line contains nn integers, a1,a2,,an (1ai1.510^7).

    Output

    Print an integer — the minimum number of integers you need to remove so that the greatest common divisor of the remaining integers is bigger than that of all integers.

    You should not remove all of the integers.

    If there is no solution, print «-1» (without quotes).

    Examples
    input
    3
    1 2 4
    output
    1
    input
    4
    6 9 15 30
    output
    2
    input
    3
    1 1 1
    output
    -1
    Note

    In the first example, the greatest common divisor is 1 in the beginning. You can remove 1 so that the greatest common divisor is enlarged to 2. The answer is 1.

    In the second example, the greatest common divisor is 3 in the beginning. You can remove 6 and 9 so that the greatest common divisor is enlarged to 15. There is no solution which removes only one integer. So the answer is 2.

    In the third example, there is no solution to enlarge the greatest common divisor. So the answer is −1.

    题意分析:

    这题意思就是给你N个数,这N个数会有一个最大公约数G,那么需要去掉K个数,使余下的N-K个数的最大公约数变大。求最小K。

    我们从gcd的原理分析,这N个数都除以gcd后,余下的数的最大公约数无法变大时因为不存在公因子,所以我们需要对这N个数进行分类,分类的标准就是是否还有共同的公因子,然后找出包含的数目最多的类别,假设这个类别有M个数。

    那么N-M就是我们最终的结果。

    这里需要注意的技巧是,在进行类别划分的时候,我们用的素数打表的原理。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int MAXN = 3e5+5;
    const int MAX = 1.5e7+5;
    int A[MAXN], cnt[MAX];
    bool visit[MAX];
    
    int gcd(int a, int b)
    {
        return b==0?a:gcd(b, a%b);
    }
    
    int Max(const int a, const int b)
    {
        return a>b?a:b;
    }
    
    
    int main()
    {
        int N;
        while(~scanf("%d", &N))
        {
            int G, ans;
            scanf("%d", &A[0]);
            G = A[0];
            for(int i = 1; i < N; i++)
            {
                scanf("%d", &A[i]);
                G = gcd(G, A[i]);
            }
    
            memset(cnt, 0, sizeof(cnt));
            memset(visit, true, sizeof(visit));
    
            for(int i = 0; i < N; i++)
                cnt[A[i]/G]++;
    
            visit[0] = visit[1] = false;
            ans = 0;
            for(int i = 2; i < MAX; i++)
            {
                int res = cnt[i];
                if(visit[i])
                {
                    for(int j = 2*i; j < MAX; j+=i)
                    {
                        visit[j] = false;
                        res += cnt[j];
                    }
                }
                ans = Max(ans, res);
            }
            printf("%d
    ", ans==0?-1:N-ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    莎士比亚名言
    庄子名言
    Javascript: 通过图片url获取图片blob对象
    toast提示 封装
    maya模型导入UE4,如何做到等比导入
    GPU渲染和CPU渲染农场成本对比
    C4D渲线框
    C4D教程笔记——高科技线框3D模型全息投影 X-Wing Hologram Animation
    arnold和redshift渲染器
    使用Redshift渲染器,怎么选电脑配置!
  • 原文地址:https://www.cnblogs.com/dybala21/p/9692092.html
Copyright © 2011-2022 走看看