题解 UVA10622 【完全P次方数 Perfect P-th Powers】
题意
给定 $N$,当 $N=a^b$ 时,求 $b$ 的最大值。($N,a,b$ 均为整数)
我的做法是:
- 给 $N$ 取绝对值后,利用唯一分解定理分解质因数。
得 $N={p_1}^{t_1} \times {p_2}^{t_2} \times ... \times {p_k}^{t_k}$。
- 因为 $b$ 要最大,且 $a,b$ 均为整数,所以 $b \mid t_1,b \mid t_2\ ...\ b \mid t_k$。
所以 $b=\gcd(t_1,t_2,\ ...\ ,t_k)$。
注意事项
如果 $N<0$,就需要特判一下 $2 \nmid b$ 才可以。
详见代码:
//the code is from chenjh
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,int> PLI;
vector<PLI> prime;
//用 pair 二元组来存储质因数、指数,记住要开 long long 来存储。
int main(){
LL n;
while(scanf("%lld",&n) && n){
//多组数据,读入至 0.
prime.clear();
LL nown=n;
n=llabs(n);
//分解质因数。
LL sqn=sqrt(n);
LL x=n;
int maxx=0;//存储最大指数。
for(LL i=2;i<=sqn;i++){//从 2 枚举到根号 n。
int sum=0;
while(x%i==0 && x>1)x/=i,sum++;
if(sum){
maxx=max(maxx,sum);
prime.push_back(make_pair(i,sum));
}
}
if(x>1) prime.push_back(make_pair(x,1)),maxx=max(maxx,1);
for(int i=maxx;i>0;i--){//从最大指数枚举到 1,来确定最大公约数。
bool flag=1;
int size2=prime.size();
for(int j=0;j<size2;j++){
if(prime[j].second%i){//如果不能被 i 整除。
flag=0;
break;
}
}
if(flag && ((nown<0 && i&1) || nown>0)){
//特判负数,当原数小于 0 时必须不能为偶次幂。
printf("%d\n",i);
break;
}
}
}
return 0;
}
你学会了吗? 谢谢观看!

浙公网安备 33010602011771号