Codeforces Round #520 (Div. 2) B Math(分解质因数思维)

题意:给你一个数字n,现在有两种操作 1 : 把n乘上任意一个数,2:当n是一个完全平方数的时候,把这个数字开平方。现在问你最少经过几次操作可以使得n最少。

思路:首先分解质因数,倘若一个数字的质因数出现的次数是2的幂的话,那么我们就可以开平方,怎么得来的?如果是2得幂次那么每次就会少一半,一半,一半,那么我们现在做的就是把n分解质因数,然后找到最大得幂次,之后把所有得所有得质因数变成最大得幂次,比如 2 2 2 3  ,那么我们乘上 2 * 3 * 3 * 3 之后变成 2 * 2 * 2 * 3 * 3 * 3 * 3 之后开平方 变成 2 * 2 * 3 * 3  之后变成 2 * 3就好了,那么显然就是质因数的成绩是最后的值

代码:

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
const int maxn = 1e6+10;
vector<int>E;
map<int,int>M;
int num = 0;
int vis[maxn] , fac[maxn];
void init(long long n)
{
    num=0;
    for(long long i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            while(n%i==0)M[i]++, n/=i;
        }
    }
    if(n>1) M[n]++;
    int cur = 1;
    for(int i = 0 ; cur <= maxn ; i ++) E.push_back(cur),cur = cur * 2;
}
int main()
{
	int n;
	scanf("%d",&n);
	init(n);
	int MAX = -1;
	for(auto i : M) MAX = max(MAX,i.Y);
	int pos = lower_bound(E.begin() , E.end() , MAX) - E.begin(); // 找到离MAX最大得2的幂次 ,那么pos就是2的多少次幂 
	int ans = 1 , flag = 0;
	for(auto i : M)
	{
		ans = ans * i.X; //  
		if(i.Y < E[pos] && !flag) flag = 1, pos++; //
	}
	printf("%d %d\n",ans,pos);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值