链接:http://acm.hdu.edu.cn/showproblem.php?pid=6623
题意:T组样例(最多5e4)。给出一个n(n<=1e18),求n的质因子中最小的指数。
思路:我们先计算1e4内的质因子的指数,并除去。现在他的质因子肯定大于1e4,由于最大为1e18,那么他最多也就是某个质因子p的4次方。我们就枚举,再分别看他们的2次方、3次方、4次方是否等于n,更新答案即可。注意开3次时,一定不要用自带的pow函数,会WA的,md,自己写个二分好了,以后记住了。WTF!!
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e4+10;
ll n;
int ans,prime[N],cnt,e;
bool vis[N];
void get_prime()
{
for(int i=2;i<=N-10;i++)
{
if(!vis[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&(ll)i*prime[j]<=N-10;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
return ;
}
ll mysqr3(ll x)
{
ll l=1,r=(ll)pow(1.0*n,1.0/3)+1,m;
while(l<=r)
{
m=(l+r)>>1;
if(m*m*m==n) return m;
else if(m*m*m>n) r=m-1;
else l=m+1;
}
return 0;
}
int cal(ll n)
{
ll sqr2=sqrt(n),sqr4,sqr3;
if(sqr2*sqr2==n)
{
sqr4=sqrt(sqr2);
if(sqr4*sqr4==sqr2)
return 4;
else
return 2;
}
else
{
sqr3=mysqr3(n);
if(sqr3*sqr3*sqr3==n)
return 3;
}
return 1;
}
int main(void)
{
get_prime();
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
ans=100;
for(int i=1;i<=cnt&&prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
e=0;
while(n%prime[i]==0)
{
//cout<<n<<endl;
e++;
n/=prime[i];
}
if(ans>e) ans=e;
}
}
if(n>1&&ans>1) ans=min(ans,cal(n));
printf("%d\n",ans);
}
return 0;
}