题目链接: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;
}