题意
删去最少的数,使gcd变大
题解
只要保留相同素数因子最多的数即可。
素数筛。
C++代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1.5e7+5;
const int MAXM = 1.5e7+5;
int Mark[MAXN];
int prime[MAXN];
int Prime(){
int tot = 0;
memset(Mark,0,sizeof(Mark));
Mark[0] = 1;
Mark[1] = 1;
for(int i = 2; i < MAXN; i++){
if(Mark[i] == 0){
prime[tot++] = i;
}
for(int j = 0; j < tot && prime[j] * i < MAXN ; j ++)
{
Mark[i * prime[j]] = 1;
if(i % prime[j] == 0)
break;
}
}
return tot ;
}
int a[300005],cnt[MAXN];
int main(){
int n ;
int tot = Prime();
cin >> n;
int g = 0;
for(int i = 0; i < n ; i++){
cin >> a[i];
g = __gcd(g , a[i]);
}
for(int i = 0 ;i < n ; i++){
a[i] /= g;
for(int j = 0; prime[j] * prime[j] <= a[i] ; ++j){
int p = prime[j];
if(a[i] % p == 0) cnt[p]++;
while(a[i] % p == 0) a[i]/= p;
}
if(a[i]!=1) cnt[a[i]] ++;
}
int ans = n;
for(int i = 2; i < MAXN; ++i){
ans = min(ans, n - cnt[i]);
}
if(ans == n) ans = -1;
cout << ans << endl;
return 0;
}