1. 程式人生 > >CF 1047 C. Enlarge GCD

CF 1047 C. Enlarge GCD

namespace ons syn define con fin 傳送門 const 個數

傳送門

[http://codeforces.com/contest/1047/problem/C]

題意

給你n個數,移除最少的數字是剩下的數字GCD大於初始GCD

思路

需要一點暴力的技巧,先求出初始GCD為g,並統計每個數字的個數這是減少復雜度的關鍵,令ans=0,我們從i=g+1開始枚舉GCD為i的個數,進行統計每次更新ans=min(ans,n-cnt)
需要註意的是某個數的因子依然是那個數倍數的因子,如2 4 8.這樣可以避免重復統計。具體看代碼

代碼

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1.5e7+5;
int a[maxn],num[maxn];
int main(){
    int n,i,j,h;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>n;
        int g,m=0,ans=n;
    //  memset(a,0,sizeof(a));
        for(i=1;i<=n;i++){
            cin>>h;
            if(i==1) g=h;
            else g=__gcd(g,h);
            num[h]++;
            if(h>m) m=h;
        }
        //cout<<g<<endl;
        for(i=g+1;i<=m;i++){
            if(a[i]==0){
                int cnt=0;
                for(j=i;j<=m;j+=i)
                a[j]=1,cnt+=num[j];
                ans=min(ans,n-cnt);
            }
        }
        if(ans==n) cout<<-1<<endl;
        else cout<<ans<<endl;
    return 0;
}

CF 1047 C. Enlarge GCD