题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6623
题意:给你一个10^18的数n,要你求n的质因子中的最低次幂是多少,比如 12=2^2 * 3^1;12的质因子中最低次幂为1;
思路:由于有t组数据,(t<=10^5),所以不能暴力去写,可以先将n^(0.2)中的素数打个表出来,如果n除完这些素数还大于1,那剩下的n最多是4个素数的乘积。
a^4, a^3, a^2, a^2*b^2, 其他的最低次幂肯定是1了,所以只需要讨论这几种情况
如果是a^4, mi=min(mi,4);
如果是a^3 mi=min(mi,3);
如果是a^2或a^2*b^2 mi=min(mi,2);
否则 mi=1;
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int a[10005],b[10005];
long long int fun(long long int x,int y)
{
long long int ans=1;
for(int i=0;i<y;i++)
ans=ans*x;
return ans;
}
int main()
{
int t,k=0,mi;
for(int i=2;i<=10000;i++)
{
if(b[i]==0)
{
a[k++]=i;
for(int j=i+i;j<=10000;j=j+i)
b[j]=1;
}
}
while(~scanf("%d",&t))
{
while(t--)
{
mi=100;
long long int n;
scanf("%lld",&n);
int x=pow(n,1/5.0);
for(int i=0;i<k;i++)
{
if(a[i]>x)
break;
int s=0;
while(n%a[i]==0)
{
n=n/a[i];
s++;
}
if(s>0)
mi=min(mi,s);
if(n==1||mi==1)
break;
}
if(n>1)
{
long long int s2=pow(n,1.0/2);
long long int s3=pow(n,1.0/3);
long long int s4=pow(n,1.0/4);
if(fun(s4,4)==n||fun(s4-1,4)==n||fun(s4+1,4)==n)//之所以要 -1 +1,是因为pow时精度有可能不是很准
mi=min(mi,4);
else if(fun(s3,3)==n||fun(s3-1,3)==n||fun(s3+1,3)==n)
mi=min(mi,3);
else if(fun(s2,2)==n||fun(s2-1,2)==n||fun(s2+1,2)==n)
mi=min(mi,2);
else
mi=1;
}
printf("%d\n",mi);
}
}
return 0;
}