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

    C. Enlarge GCD

    题目链接:https://codeforces.com/contest/1047/problem/C

    题意:

    给出n个数,然后你可以移除一些数。现在要求你移除最少的数,让剩下数的gcd变大。

    题解:

    首先可以先让所有数都除以他们的gcd,让他们互质,好让问题简单化。

    由唯一分解定理,题目中的问题可以转化为:找出最多数都共有的质因子,假设其数目为mx,答案就是n-mx。

    上面的想法也是基于贪心,具体做法还是有点技巧,就是在筛素数的时候就进行判断,具体见代码吧:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 3e5+5,M = 2e7+5;
    int n;
    int a[N];
    int cnt[M],vis[M];
    int main(){
        scanf("%d",&n);
        int d=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            d=__gcd(d,a[i]);
        }
        for(int i=1;i<=n;i++) cnt[a[i]/d]++;
        int mx=0;
        for(int i=2;i<=2e7;i++){
            int tot=0;
            if(!vis[i]){
                vis[i]=1;
                for(int j=i;j<=2e7;j+=i){
                    vis[j]=1;
                    tot+=cnt[j];
                }
            }
            mx=max(mx,tot);
        }
        int ans=n-mx;
        if(ans==n) ans=-1;
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    可执行
    创建
    可能的加分项
    给老师的建议
    周总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10408411.html
Copyright © 2011-2022 走看看