Enlarge GCD(素数筛)
题意
删去最少的数,使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; }