题解 UVA10622 【完全P次方数 Perfect P-th Powers】

题意

给定 $N$,当 $N=a^b$ 时,求 $b$ 的最大值。($N,a,b$ 均为整数)

我的做法是:

  1. 给 $N$ 取绝对值后,利用唯一分解定理分解质因数。

得 $N={p_1}^{t_1} \times {p_2}^{t_2} \times ... \times {p_k}^{t_k}$。

  1. 因为 $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;
}

你学会了吗? 谢谢观看!

posted @ 2022-07-23 17:14  Chen_Jinhui  阅读(16)  评论(0)    收藏  举报  来源