//呼,完全理解用了太久时间了,寄,但愿这思路以后能派上用场。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=31700;//N的4次方约为1e18
int ft[N],td[N],fh[N];//一次方,三次方,四次方
bool p[N];//做标记,用bool
signed main()
{
for(int i=2;i<N;i++)
{
if(p[i]==0)
{
ft[++ft[0]]=i;//这里利用ft[0]计数,初始值为0
td[ft[0]]=i*i*i;
fh[ft[0]]=i*i*i*i;
for(int j=i*i;j<N;j+=i)//导致我查了很久浮点错误的bug就是在这里产生的,j+=I;不能因为是最熟悉的板子就完全相信自己不会出错
p[j]=1;
}
}
int t;
cin>>t;
while(t--)
{
int n,ii=1;
cin>>n;
for(int i=1;fh[i]<=n;i++)//注意是4次方,
{
if(n%ft[i]==0)//注意是一次方
{
while(n%td[i]==0)
{
ii*=ft[i];
n/=td[i];//把n变小
}
while(n%ft[i]==0)
n/=ft[i];//继续尽可能地把n变小
}
}
//这个有点欧拉函数板子的感觉,这个是把n变成最多只有3个质数相乘的结果(可以重复)例:n=(2*3*5*7*11*13*17*19)=>n=(13*17*19)
例:n=(3*3*3)=>n=(3*3*3)
//当有四个数存在时,最小的质因数会被剔除,如果剔除的数有重复的,也会被剔除,此时最后的n的质数的个数会少于三个
int l=0,r=1000001,res;//熟悉的二分,查找最后的可能的结果
while(l<r)
{
int mid=(l+r)/2;
if((mid*mid*mid)<=n)res=mid,l=mid+1;
else r=mid;
}
if((res*res*res)==n)//当且仅当存在3个质数,且3个质数为同一个质因数
ii*=res;
cout<<ii<<'\n';
}
}
//自己做这个题的时候,一种是ii=所有指数可取3倍的质数的积,结果是超时
//另一种也是二分,答案错误,原因是i*i*i<=n和n%(i*i*i)不能兼顾,后者无单调性
//之前的两种解法的结合,略微能和现在的解法沾点边