版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82824407
http://codeforces.com/contest/1047/problem/C
直接暴力即可。
首先求出所有数的gcd
然后计数:每个数/gcd 结果的个数
最后直接线性筛 边筛边判断 找到含有共同因子最多的数字 去掉不含有这个公共因子的数字 gcd就会变大
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5,M=1.5e7+5;
int n, g, ans, a[N], cnt[M], vis[M];
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i ++){
scanf("%d",&a[i]);
g = __gcd(a[i],g);
}
for(int i = 1;i <= n;i ++){
cnt[a[i] / g] ++;
}
for(int i = 2;i < M;i ++){
int tmp = 0;
if(!vis[i]){
for(int j = i;j < M;j += i){
vis[j] = 1;
tmp += cnt[j];
}
}
ans = max(ans, tmp);
}
printf("%d\n",ans?n-ans:-1);
}