题目链接:Codeforces - Math
题目大意:你个一个数字,你可以乘某个数,或者开平方,求能得到的最小的数和最小次数。
先质因数分解后,我们可以发现,每个质因数一定会只被消到只有一个。然后把所有都变成一样的最高质因数次幂,然后一直开方即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,res=1,ans,flag,mx=1,k=1; map<int,int> mp;
signed main(){
cin>>n;
for(int i=2;i*i<=n;i++){
while(n%i==0) mp[i]++,n/=i;
}
if(n>1) mp[n]++;
for(auto x:mp){
res*=x.first; mx=max(mx,x.second);
}
for(auto x:mp) if(x.second<mx) flag=1;
while(k<mx) k<<=1; ans=max(1LL*(k!=mx),flag);
while(k>1) ans++,k>>=1;
cout<<res<<' '<<ans;
return 0;
}