题目链接: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;
}