2019杭电暑期多校第四场 J:Minimal Power of Prime(数论)

【题解】

题意:输出n的唯一分解式的质因子的最小幂次。

思路:因为n有1e18,所以显然不能枚举全部质因子会超时,所以我们考虑枚举1e18^(1/5)内的质因子,这样全部除掉这些质因子之后最多也只有p^4了,再考虑剩下的n是不是四次方数,三次方数,二次方数,或者质数就是一次。

【代码】

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
int pri[maxn],E;
int cnt=0;
bool vis[maxn];
void init()
{
    for(int i=2;i<=E;i++){
        if(!vis[i]) pri[++cnt]=i;
        for(int j=1;j<=cnt&&pri[j]*i<=maxn;j++){
            vis[pri[j]*i]=1;
            if(i%pri[j]==0)
                break;
        }
    }
}
int main()
{
    E=floor(pow(1e18,0.2))+1; //1e18^(1/5)+1
    init();
    int t; scanf("%d",&t);
    while(t--){
        ll n; scanf("%lld",&n);
        int mi=100;
        for(int i=1;i<=cnt&&n>1;i++){
            if(n%(ll)(pri[i])==0){
                int ct=0;
                while(n%(ll)(pri[i])==0){
                    ct++;
                    n/=(ll)(pri[i]);
                }
                mi=min(mi,ct);
                if(mi==1) break;
            }
        }
        if(n>1ll){
            double r=round(pow(1.0*n,1.0/4));
            ll rr=(ll)r;
            if(rr*rr*rr*rr==n) mi=min(mi,4);
            else{
                r=round(pow(1.0*n,1.0/3));
                rr=(ll)(r);
                if(rr*rr*rr==n) mi=min(mi,3);
                else{
                    r=round(pow(1.0*n,1.0/2));
                    rr=(ll)(r);
                    if(rr*rr==n) mi=min(mi,2);
                    else mi=1;
                }
            }
        }
        printf("%d\n",mi);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值