CodeForces - 1047C Enlarge GCD
题意:
给你 n 个数,求出他们的最大公因数为 k ,求最少需要删掉几个数才能使最大公因数 k 变大
思路:
从公因数 k+1 开始枚举,找出需要删掉最少的数的个数
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1.5e7+10;
typedef long long ll;
int a[maxn],pre[maxn];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int n;
memset(a,0,sizeof(a));
scanf("%d",&n);
int k; //最大公因数
int x;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
a[x]++;
if(i==0)
k = x;
else
k = gcd(x,k);
}
int ans = n;
for(int i=k+1;i<maxn;i++)
{
if(!pre[i])
{
int cnt = 0; // 计算有多少个数能被 i 整除
for(int j=i;j<maxn;j+=i)
{
pre[j] = 1;
cnt += a[j];
}
ans = min(ans,n-cnt); // n-cnt 为需要删掉的数的个数
}
}
if(ans==n)
printf("-1\n");
else
printf("%d\n",ans);
return 0;
}