1. 程式人生 > >Enlarge GCD

Enlarge GCD

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