题意:求出使y^p=x成立最大p值.
先对x进行素数分解,有X=(fac[1]^tn[1])*(fac[2]^tn[2])....(fac[n]^tn[n]) (fac为X的素数因子,tn为对应的次方数)
显然p=gcd(tn[1],tn[2],.....,tn[n]).
注意当n为负数时,p必须为奇数
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn=100000+10;
bool isprime[maxn];
int prime[maxn];
void init()
{
for(int i=1;i<maxn;i+=2) isprime[i]=1,isprime[i-1]=0;
for(int i=3;i<maxn;i+=2)
if(prime[i]){
for(int j=i*i;j<maxn;j+=i) isprime[j]=0;
}
isprime[1]=0,isprime[2]=1;
int k=0;
for(int i=2;i<maxn;i++)
if(isprime[i]) prime[++k]=i;
prime[0]=k;
}
int fac[10],tn[10];
void divide(long long x)
{
int k=0;
for(int i=1;i<prime[0]&&(long long)prime[i]*prime[i]<=x;i++)
if(x%prime[i]==0){
fac[++k]=i;
int s=0;
while(x%prime[i]==0) x/=prime[i],s++;
tn[k]=s;
}
if(x>1) fac[++k]=x,tn[1]=1;
fac[0]=tn[0]=k;
}
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
int main()
{
init();
long long n;
while(cin>>n,n){
bool flag=0;
if(n<0){
flag=1;
n=-n;
}
divide(n);
int ans=tn[1];
for(int i=2;i<=tn[0];i++)
ans=gcd(ans,tn[i]);
if(flag&&ans%2==0){
while(ans%2==0) ans/=2;
}
cout<<ans<<endl;
}
return 0;
}