题目链接:https://codeforces.com/problemset/problem/1034/A
题目大意:给你n个数,它们的最大公因子为m,删除ans个数之后使得最后的最大公因子大于m,求ans。
思路:先求出原始的最大公因子m,再将所有数都缩小m倍,记录出现的数的次数,此时具有相同倍数的数可以视为同一类,可以同时保留或者去除,最后暴力筛求最小个数,菜鸡说不清楚,详见代码。。。
AC代码:
/*
cf 1034A
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxx 15000005
int a[300005];
int cnt[maxx];
int vis[maxx];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
int g=a[1];
for(int i=2;i<=n;i++)
{
g=__gcd(g,a[i]);
}
for(int i=1;i<=n;i++)
{
a[i]/=g;
cnt[a[i]]++;
}
cnt[0]=cnt[1]=0;
int ans=0;
for(int i=2;i<maxx;i++)//暴力筛
{
if(!vis[i])
{
int sum=cnt[i];
vis[i]=1;
for(int j=2*i;j<maxx;j+=i)
{
vis[j]=1;
sum+=cnt[j];
}
ans=max(ans,sum);
}
}
if(ans==0)
{
ans=-1;
}
else
{
ans=n-ans;
}
printf("%d\n",ans);
return 0;
}
/*
Input
3
1 2 4
Output
1
Input
4
6 9 15 30
Output
2
Input
3
1 1 1
Output
-1
*/
我一定可以的!!!