Enlarge GCD CodeForces - 1034A(质因数分解)
题目大意
给出n个数,删去其中一些使得总的gcd最大
解题思路
除去公因数数之后将所有的数分解,并对素因数计数,n-最大的素因数出现次数即为答案.为了在规定时间内通过,分解质因数时应当只遍历质数从而达到 的复杂度.值得一提的是,这题使用pollard-rho算法不能通过.下次留个心眼,较小的数还是不要使用pollard-rho分解
AC代码
#include<bits/stdc++.h>
using namespace std;
const int sz=15e6+5;
int sum[sz];
int a[300005];
bool prime[sz];
int p[sz],tot;
void init()
{
for(int i=2;i<sz;i++) prime[i]=true;
for(int i=2;i<sz;i++){
if(prime[i]) p[tot++]=i;
for(int j=0;j<tot&&i*p[j]<sz;j++){
prime[i*p[j]]=false;
if(i%p[j]==0) break;
}
}
}
int main()
{
int n;
cin>>n;
int x;
init();
memset(sum,0,sizeof(sum));
int d=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]),d=__gcd(a[i],d);
for(int i=1;i<=n;i++)
{
x=a[i]/d;
for(int j=0;p[j]*p[j]<=x&&j<tot;j++)
{
if(x%p[j]==0) sum[p[j]]++;
while(x%p[j]==0) x/=p[j];
}
if(x>1)sum[x]++;
}
int ans=0;
for(int i=2;i<sz;i++) ans=max(sum[i],ans);
if(ans==0) cout<<-1<<endl;
else cout<<n-ans<<endl;
}