Enlarge GCD
阿新 • • 發佈:2018-12-11
#include <bits/stdc++.h>
using namespace std;
int a[302000];
int cnt[(int)(2e7)];
bool done[(int)(2e7)];
const int m=1.5e7;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;//讀入個數
int g;//公共最大公約數 Greatest Common Divisor
for(int i=1;i<=n;i++){
cin>>a[i];//讀入每個數
if(i>1){//計算公共最大公約數 __gcd是自帶的函式
g=__gcd(a[i],g);
}
else g=a[i];
}
//原理:剩下x個數的gcd一定是n個數的gcd的倍數
for(int i=1;i<=n;i++){
++cnt[a[i]/g];//計算每個數除以g之後出現的次數
}
//4
//4 8 12 16
//->1 2 3 4 除以4之後
//cnt[1]=1
//cnt[2]=1
//cnt[3]=1
//cnt[4]=1
//原理:整除2的肯定比整除4的多
int ans=0;
for(int i=2;i<=m;++i){
if (!done[i]){//如果i的倍數沒有被標記
int sum=0;
for(int j=i;j<=m;j+=i){// 2 4 6 8... 3 6 9 ... 4不行已經被標記了 5 10 15 20 ...
sum+=cnt[j];//統計n個數中是i的倍數的個數
done[j]=true;//標記一下
}
ans=max(ans,sum);
}
}
if(ans==0){
puts("-1");
}
else{
cout<<n-ans<<endl;
}
return 0;
}