变换

6 篇文章 0 订阅

在这里插入图片描述

在这里插入图片描述

思路: 最佳玄学算法!!!

因为若将所有数(除那个选择的数)都乘一个正整数其实是在做无用功!!!
所以我们应当乘一个正整数的倒数!!!就相当于除一个数!!!

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"后每个数就是没什么联系的了,所以
我们之后的每一次操作都会去除一个数的*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值