Codeforces Round #511 (Div. 2) C. Enlarge GCD 【暴力列舉+素數晒法】
阿新 • • 發佈:2018-12-13
題意:刪去儘可能少的數,得到一個比原先的gcd大的gcd,如果沒有就輸出-1,有就輸出刪除的個數;
思路:
用素數晒法,去列舉大於g(最初的gcd)的數,計數陣列中有幾個數能被g整除,取個數的最大值;要注意的是,如果只有兩個數 1 2,那麼可以刪除1這個數得到更大的gcd;
#include<bits/stdc++.h> using namespace std; const int Maxn = 2e7; int cnt[Maxn]; bool used[Maxn]; int main (void) { int n,maxn = 0,tmp,g = -1; scanf("%d",&n); for (int i = 0; i < n; ++i) { scanf("%d",&tmp); cnt[tmp]++; if(g == -1) g = tmp; else g = __gcd (g, tmp); maxn = max (tmp, maxn); } int ans = 0; for (int i = g+1; i <= maxn; ++i) { int ct = 0; if(!used[i]) { for (int j = i; j <= maxn; j+=i) { ct+=cnt[j]; used[j] = 1; } ans = max (ans, ct); } } int ret = ans ? n-ans : -1; printf("%d\n",ret); return 0; }