Codeforces 1062B.Math

想不到刚学的质因数分解就用到了。我们可以把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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值