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

【题解】

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

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

【代码】

#include
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);
    }
}

 

你可能感兴趣的:(2019杭电暑期多校第四场 J:Minimal Power of Prime(数论))