给你一个n,求最大的x,满足a^x==n(a是整数)。。。
n可以分解为素数的乘积的形式,即n=p1^a1*p2^a2*...*pm^am,发现可以变形,
n=(p1^b1*p2^b2*..*pm^bm)^x,(b1*x=a1,b2*x=a2),
发现就是求素因子次方的最大公约数。
刚开始没有求素数表,tle了,
因为可能是负数,而负数的任何一个素因子的偶数次方不可能为正&&奇数*偶数=偶数,偶数*偶数还是偶数,所以如果是次方为偶数,进行/2运算,直到为奇数。。
#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 50000
int pir[N],cnt;
void init()
{
int i,j;
int tt[N];
cnt=0;
memset(tt,0,sizeof(tt));
for(i=2;i<N;i++)
{
if(tt[i]==0)
{
for(j=2;i*j<N;j++)
tt[i*j]=1;
pir[cnt++]=i;
}
}
}
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
init();
int n;
int ans;
int i,j,t;
int a[N],m;
while(scanf("%d",&n)!=-1&&n)
{
t=n;
i=0;
m=0;
while(n!=1)
{
if(pir[i]>sqrt(fabs((double)n)))break;
if(n%pir[i]==0)
{
j=0;
while(n%pir[i]==0)
{
j++;
n/=pir[i];
}
a[m++]=j;
}
i++;
}
if(t<0)
{
for(i=0;i<m;i++)
while(a[i]%2==0)a[i]/=2;
}
ans=a[0];
for(i=1;i<m;i++)
ans=gcd(ans,a[i]);
if(m==0)ans=1;
printf("%d\n",ans);
}
return 0;
}