【质因数分解】牛客模拟赛#2 D-变换

本文解析了如何通过D-变换问题中的质因子分解来最小化操作次数,实现数组元素同步为最小公倍数。关键步骤包括求取初始数组的GCD,然后用质因子分解的方法调整每个数。算法展示了如何在两次操作内达成目标,并提供了C++代码实现。
摘要由CSDN通过智能技术生成

链接

D - 变换

题目描述

在这里插入图片描述

样例输入

2
5 7

样例输出

2

数据范围或提示

样例解释
可以选中第二个数字不变,将第一个数字除以 5,然后选中第一个数字不变,将第二个数字除以 7。两次操作后,数组中所有数字均变为 1。当然还有其他方法,如将两个数字最终都变为 35 也只需要 2 次操作。

数据范围
在这里插入图片描述

思路

其实题目就是每次选一个数,使它除以一个质因子x
那么最后肯定是要变为gcd的
我们就求出gcd后,每个数除以它,然后求质因子根数之和就好了

代码

#include<iostream>
#include<cstdio>

using namespace std;

int n, gcdx, a[1000005], ans;

int gcd(int x, int y)
{
	if (!y) return x;
	return gcd(y, x % y);
}

int main()
{
	scanf("%d", &n);
	scanf("%d", &a[1]);
	gcdx = a[1];
	for (int i = 2; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		gcdx = gcd(a[i], gcdx);	
	}	
	for (int i = 1; i <= n; ++i)
		a[i] /= gcdx;
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 2; j * j <= a[i]; ++j)
		{
			while (!(a[i] % j)) {
				a[i] /= j; 
				ans++;
			}
		}
		if (a[i] > 1) ans++;
	}//求质因子
	printf("%d", ans);
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值