/*
题目:
给出n,问n = b^p中p符合该等式的最大值
分析:
先求出所有n的质因子,然后对这m个质因子分类统计,比如
n = 36时,可以分成 2个2,2个3,然后求出所有这些基数的
最大公因数gcd。另外由于有负数的存在,所以求到的gcd若
为偶数时,需要不断除二直到为奇数为止
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int X = 150000;
int di[50],top;
int prime[15000],cnt;
bool notprime[X];
int num[X];
int ans[50];
void init() //筛法
{
cnt = 0;
memset(notprime,false,sizeof(notprime));
for(int i=2;i<X;i++)
if(!notprime[i])
{
prime[++cnt] = i;
for(int j=i+i;j<X;j+=i)
notprime[j] = true;
}
}
int gcd(int a,int b)
{
if(a==0)
return b;
return gcd(b%a,a);
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
long long n;
int half;
init();
while(cin>>n,n)
{
memset(num,0,sizeof(num));
long long temp = max(n,-n);
half = (int)sqrt(temp*1.0);
top = 0;
for(int i=1;prime[i]<=half+1;i++) //求出所有质因数
if(temp%(long long)prime[i]==0)
{
temp /= prime[i];
di[++top] = prime[i];
i--;
num[di[top]]++;
if(!temp||temp==1)
break;
}
if(top==0)
{
printf("1\n");
continue;
}
memset(ans,0,sizeof(ans));
int head = 0;
for(int i=1;i<=top;i++)
ans[++head] = num[di[i]],num[di[i]] = 0;
int res = ans[1];
for(int i=2;i<=head;i++)
{
res = gcd(res,ans[i]);
if(res==1)
break;
}
if(n<0)
{
if(res%2==0)
{
while(res%2==0)
res >>= 1;
printf("%d\n",res);
}
else
cout<<res<<endl;
}
else
printf("%d\n",res);
}
return 0;
}