思路: 最佳玄学算法!!!
因为若将所有数(除那个选择的数)都乘一个正整数其实是在做无用功!!!
所以我们应当乘一个正整数的倒数!!!就相当于除一个数!!!
1.找出所有数的“GCD”,相除后,算出所有数的所有质因数,并全部相加,再输出个数!
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <queue>
#include <cmath>
#define LL long long
using namespace std;
const LL N=1e6+100,mod=1e9+7;
LL n,cnt,ans,num,a[N];
LL gcd (LL a,LL b)
{
if (a%b==0) return b;
return gcd (b,a%b);
}
int main ()
{
scanf ("%lld",&n);
for (int i=1;i<=n;i++)
{
scanf ("%lld",&a[i]);
ans=i==1?a[i]:gcd (a[i],ans); //算出最大公约数!!!
}
for (int i=1;i<=n;i++)
{
a[i]/=ans;
for (int j=2;j*j<=a[i];j++) //分解质因数!!!
{
while (a[i]%j==0)
{
num++;
a[i]/=j;
}
}
if (a[i]>1) num++;
}
printf ("%lld",num);
return 0;
}
可行性:
1:最大"GCD"其实是可以忽略的,因为最后要将所有数
都变为一个相同的值,所以我们就可以将它去掉不看。
2.去除最大"GCD"后每个数就是没什么联系的了,所以
我们之后的每一次操作都会去除一个数的*/