变换
解题思路
这道题其实比较玄学。我们只考虑乘的情况:当一个数以外的所有数都乘以一个素数,那么我们可以变相的理解为这个数除以了这个素数——因为题目只要求相等。那么我们就可以把题目转换一下:给定一个序列,你每次可以将一个数除以一个素数,请问你需要多少次才能将序列里的数转换成相同的数。这样不就很简单了——只需要求出这个序列所有数的最大公约数,然后求每个数在除以最大公约数后还有多少个素数。
code
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int n,a[1000010],ans;
int gcd(int x,int y)
{
if(x%y==0)
return y;
return gcd(y,x%y);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int x=a[1];
for(int i=2;i<=n;i++)
x=gcd(x,a[i]);
for(int i=1;i<=n;i++)
{
a[i]/=x;
for(int j=2;j*j<=a[i];j++)
while(a[i]%j==0)
a[i]/=j,ans++;
if(a[i]>1)
ans++;
}
cout<<ans<<endl;
}