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

 

posted @ 2019-02-20 18:48  heyuhhh  阅读(116)  评论(0编辑  收藏  举报