题意:给你一个数字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);
}