
题意:给出一个x 可以做两种操作 ①sqrt(x) 注意必须是完全平方数 ② x*=k (k为任意数) 问能达到的最小的x是多少
思路: 由题意以及 操作 应该联想到唯一分解定理 经过分析可以知道 ②操作最多使用一次 将x分解成一系列素数乘积的时候 只要看最高幂次离哪个二的幂近(只取上界)
并且把所以素因子都凑成找到的这个二的幂 只要x*=k一步就可以凑成 然后一直操作①模拟即可 而如果刚好全部都相等并且都是2的幂次 那么直接一直操作①模拟即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+;
int fac[maxn],mi[maxn];
int solve(int x){
ll tmp=;
for(int i=;;i++){
if(tmp>=x){
return i;
}
else tmp<<=;
}
}
map<ll,int>mp;
int main(){
int n;
scanf("%d",&n);
ll la=;
for(int i=;i<=;i++){
la<<=;
if(la>)break;
mp[la]=;
}
if(n==){
cout<<<<" "<<<<endl;
return ;
}
int flag=;
long long ans=;
for(int i=;i<=n;i++){
if(n%i==){
fac[flag]=i;
ans*=i;
while(n%i==){
n/=i;
mi[flag]++;
}
flag++;
}
}
int maxnum=;
int cnt=;
int ok=;
for(int i=;i<flag;i++){
maxnum=max(maxnum,mi[i]);
if(mp[mi[i]]!=)ok=;
if(i>&&mi[i]!=mi[i-])ok=;
}
if(maxnum==){
cout<<ans<<" " <<<<endl;
return ;
}
if(maxnum&)maxnum++;
if(ok)cnt++;
// cout<<maxnum<<endl;
cnt+=solve(maxnum);
cout<<ans<<" "<<cnt<<endl;
return ;
}