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