想不到刚学的质因数分解就用到了。我们可以把n分解为p1^e1 * p2^e2…pn ^en的形式,其中p1<p2<…<pn,则答案的第一个数就是p1p2…*pn;第二个数就是使得e1=e2=…=en=1的费用.
由于只能sqrt或者乘上一个任意数,可知当e1=e2=…=en= 2^k 时答案为k,所以我们要这样构造,我们先找出最大的ei,1<=i<=n,并求出这个ei在哪个2^i-1 到2^i 之间。若存在ej != ei那么直接乘一个数,使得e1=e2=…=en=2^i,答案就是i+1.如果所有的ej都相等,那么要考虑ei 和2^i是否相等决定是否加1.
#include <bits/stdc++.h>
using namespace std;
int n,a[1010101],ans =1,mam,cnt,nn,f=1,flag;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;nn=n;
if(n == 1){
cout<<1<<' '<<0;return 0;
}
for(int i = 2;i<=n;i++) {
if(n%i==0){
ans *= i;
while(n&&n%i==0) a[i]++, n/=i;
}
}
int j;
for(int i = 1;i<=nn;i++)
if(a[i]) {mam = a[i],j=i;break;}
for(int i = j+1;i<=nn;i++){
if(a[i]) mam = max(mam,a[i]);
}
for(int i =1;i<=nn;i++){
if(a[i]&&a[i] != mam) {
flag = 1;cnt++;break;
}
}
while(f<mam) f*=2,cnt++;
if(!flag && mam<f) cnt++;
cout<<ans<<' '<<cnt;
return 0;
}