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

题意

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

我的做法是:

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

N=p1t1×p2t2×...×pktk

  1. 因为 b 要最大,且 a,b 均为整数,所以 bt1,bt2 ... btk

所以 b=gcd(t1,t2, ... ,tk)

注意事项

如果 N<0,就需要特判一下 2b 才可以。

详见代码:

//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 @   Chen_Jinhui  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

一言

笑是对身边的事物感到一瞬间的幸福而表现出来的东西。
——CLANNAD
点击右上角即可分享
微信分享提示