#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct EulerSieve
{
vector<int> p, m;
EulerSieve(int N) : m(N, 0)
{
for (long long i = 2, k; i < N; ++i)
{
if (!m[i])
p.push_back(m[i] = i);
for (int j = 0; j < p.size() && (k = i * p[j]) < N; ++j)
if ((m[k] = p[j]) == m[i])
break;
}
}
} E(pow(1e18, 0.2) + 9);
ll t, n;
bool check(int q)
{
if (q == 4)
{
int t = pow(n, 0.25) + 0.5;
return 1LL * t * t * t * t == n || 1LL * (t - 1) * (t - 1) * (t - 1) * (t - 1) == n || 1LL * (t + 1) * (t + 1) * (t + 1) * (t + 1) == n;
}
if (q == 3)
{
int t = pow(n, 1.0 / 3.0) + 0.5;
return 1LL * t * t * t == n || 1LL * (t - 1) * (t - 1) * (t - 1) == n || 1LL * (t + 1) * (t + 1) * (t + 1) == n;
}
if (q == 2)
{
int t = pow(n, 0.5) + 0.5;
return 1LL * t * t == n || 1LL * (t - 1) * (t - 1) == n || 1LL * (t + 1) * (t + 1) == n;
}
}
int main()
{
for (scanf("%lld", &t); t--;)
{
scanf("%lld", &n);
int num = 0, minn = 63;
for (int i = 0; i < E.p.size(); i++)
{
for (num = 0; n % E.p[i] == 0; ++num)
n /= E.p[i];
if (num)
minn = min(num, minn);
if (minn == 1)
break;
}
if (n > 1)
{
int ans = 1;
if (minn > 1 && n > 1)
for (int q = 4; ans == 1 && q > 1; --q)
if (check(q))
ans = q;
minn = min(minn, ans);
}
printf("%d\n", minn);
}
}