【题解】
题意:输出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);
}
}