A. Enlarge GCD(埃式筛)

传送门

这个题的题意就是

给出n个数,可以自己求出他们的最大公因数m,去掉最少的数使得剩下的数的最大公因数大于m,如果没有解决方案则输出 -1即可

这个题你先求出来它的m,然后令每一个数除以m,这样就转化成了求剩下数的gcd为i这个值的最多保留多少个,这样用埃式筛筛一下就行

为什么要这样呢,因为你都除以m之后,你就找剩下数的最长子序列gcd为i的最长长度,因为你都除了m,所以这个i从2开始枚举就行,

 

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6*15+10;
int a[maxn];
int cnt[maxn];
bool vis[maxn];
int main(){
    int n;
    cin>>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++){
        a[i]/=d;
        cnt[a[i]]++;
    }
    int ans=0;
    for(int i=2;i<maxn;i++){
        if(!vis[i]){
            int sum=cnt[i];
            vis[i]=true;
            for(int j=2*i;j<maxn;j+=i){
                vis[j]=true;
                sum+=cnt[j];
            }
            ans=max(ans,sum);
        }
    }
    if(!ans){
        cout<<-1<<endl;
    }
    else{
        cout<<n-ans<<endl;
    }
}

 

 

 

https://codeforces.com/problemset/problem/1034/A

posted @ 2021-05-03 19:46  lipu123  阅读(57)  评论(0编辑  收藏  举报