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;
    }
    

      

  • 相关阅读:
    2019牛客暑期多校训练营(第二场)
    2019牛客暑期多校训练营(第一场)
    JOISC2014 挂饰("01"背包)
    UPC 2019年第二阶段我要变强个人训练赛第十六场
    UPC个人训练赛第十五场(AtCoder Grand Contest 031)
    Wannafly挑战赛15 C“出队”(约瑟夫环类问题)
    UVA 133“The Dole Queue”(循环报数处理技巧)
    洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划
    洛谷P1273 有线电视网 树上分组背包DP
    CF1097D Makoto and a Blackboard 质因数分解 DP
  • 原文地址:https://www.cnblogs.com/dybala21/p/9692092.html
Copyright © 2011-2022 走看看