Codeforces - Math

题目链接: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;
}
发布了483 篇原创文章 · 获赞 241 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104101845