C. Enlarge GCD
题目链接:https://codeforces.com/contest/1047/problem/C
题意:
给出n个数,然后你可以移除一些数。现在要求你移除最少的数,让剩下数的gcd变大。
题解:
首先可以先让所有数都除以他们的gcd,让他们互质,好让问题简单化。
由唯一分解定理,题目中的问题可以转化为:找出最多数都共有的质因子,假设其数目为mx,答案就是n-mx。
上面的想法也是基于贪心,具体做法还是有点技巧,就是在筛素数的时候就进行判断,具体见代码吧:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3e5+5,M = 2e7+5; int n; int a[N]; int cnt[M],vis[M]; int main(){ scanf("%d",&n); int d=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); d=__gcd(d,a[i]); } for(int i=1;i<=n;i++) cnt[a[i]/d]++; int mx=0; for(int i=2;i<=2e7;i++){ int tot=0; if(!vis[i]){ vis[i]=1; for(int j=i;j<=2e7;j+=i){ vis[j]=1; tot+=cnt[j]; } } mx=max(mx,tot); } int ans=n-mx; if(ans==n) ans=-1; cout<<ans; return 0; }