题目链接:C. Enlarge GCD
给你一个序列 删除一些数看可以让他们之间的gcd变大如果可以输出删除数量最小的个数
先求出共同 gcd 然后除去
找出出现最多的质数 然后减去就可以了
#include<bits/stdc++.h> using namespace std; #define maxn 10000010 //#define int long long int a[maxn],pr[maxn],len=0,b[maxn]; map<int ,int >mp; bool fa(int x){ if(x==2) return 1; if(x%2==0) return 0; for(int j=3;j*j<=x;j+=2){ if(x%j==0) return 0; } return 1; } int gcd(int a,int b){ return b? gcd(b,a%b):a; } int main(){ int n; cin>>n; for(int j=2;j<=5000;j++){ if(!b[j]){ pr[len++]=j; } for(int k=1;k*j<=5000;k++){ b[k*j]=1; } } for(int j=0;j<n;j++){ scanf("%d",&a[j]); } int g=a[0]; for(int j=1;j<n;j++){ g=gcd(g,a[j]); } for(int j=0;j<n;j++){ a[j]=a[j]/g; } int mx=0; for(int j=0;j<n;j++){ for(int k=0;pr[k]<=a[j]&&k<len&&a[j]>1;k++){ if(a[j]<pr[k])break; if(a[j]%pr[k])continue; if(a[j]%pr[k]==0){ while(a[j]%pr[k]==0){ a[j]/=pr[k]; } mp[pr[k]]++; } } if(a[j]!=1) mp[a[j]]++; } for(auto it=mp.begin();it!=mp.end();it++){ mx=max(mx,it->second); // cout<<it->first<<" "<<it->second<<endl; } if(mx>0) cout<<n-mx<<endl; else cout<<"-1"<<endl; }