CF 1047 C. Enlarge GCD
阿新 • • 發佈:2018-09-25
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