2019年杭电多校第四场 HDU - 6623 Minimal Power of Prime(质因子的最小幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6623

题意:给你一个n,质因子分解之后,求质因子最小的指数(n<=1e18)

由于50000个询问,大数质因子分解超时,   所以先把1e4之内的素数筛出来,先由1e4的素数判断,如果pirme[i]是n的质因子,就让n除,能除就除,最后如果不是1,那么剩下的n就是大于1e4的数,质因子的幂最大就是4  所以判断一下此时的n开方,开3次方,4次方能不能开出整数就行了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 1e4+10;
bool vis[MAX];
int pr[MAX];
int cnt;
void getpr(){
    vis[0]=vis[1]=true;
    for (int i = 2; i < MAX;i++){
        if(!vis[i]) pr[cnt++]=i;
        for (int j = 0; j < cnt&& i*pr[j]< MAX;j++){
            vis[i*pr[j]]=true;
            if(i%pr[j]==0) break;
        }
    }
}
int check(ll x,int k,ll n){
    ll sum=1;
    for (int i = 1; i <= k;i++){
        sum*=x;
    }
    if(sum>n) return 1;
    else if(sum<n) return -1;
    else return 0;
}
bool solve(ll l,ll r,ll n,int k){
    while(l<=r){
        ll mid=(l+r)>>1;
        int w=check(mid,k,n);
        if(w==1){
            r=mid-1;
        }
        else if(w==-1)l=mid+1;
        else return true;
    }
    return false;
}
int solvee(ll w){
    if(w==1) return 1000;
    if(solve(10009,1000000,w,3)){
       return 3;
    }
    ll xx=sqrt(w);
    if((xx-1)*(xx-1)==w) xx--;
    if((xx+1)*(xx+1)==w) xx++;
    if(xx*xx!=w) return 1;
    w=xx;
    xx=sqrt(xx);
    if((xx-1)*(xx-1)==w) xx--;
    if((xx+1)*(xx+1)==w) xx++;
    if(xx*xx==w) return 4;
    else return 2;
}
int main(){
    getpr();
    int T;
    scanf("%d", &T);
    while(T--){
        ll n;
        scanf("%lld", &n);
        ll w = n;
        int ans = 10000;
        for (int i = 0; i < cnt; i++){
            if(n % pr[i] == 0){
                int w = 0;
                while(n % pr[i] == 0){
                    w++;
                    n /= pr[i];
                }
                ans = min(ans, w);
            }
            if(n==1) break;
        }
        if(n>10009) ans=min(ans, solvee(n));
        if(ans==10000) ans=1;    
        printf("%d\n",ans);
        
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值