被思维题整的死去活来,用Pollard_Rho交了6次都T掉才觉得是算法假了,转变想法。
先把小范围内的素数预处理出来,然后对每次读入的n,在开4次方内然后枚举素因子判断。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf = 1e18;
int prime[10010],vis[10010],tot;
int read()
{
char c;
int f = 1,x = 0;
do
{
c = getchar();
if(c == '-')
f = -1;
}while(c < '0' || c > '9');
do
{
x = x * 10 + c - '0';
c = getchar();
}while(c >= '0' && c<= '9');
return f * x;
}
void Prime()
{
for(int i = 2;i <= 10000; i++)
{
if(!vis[i])
prime[++tot] = i;
for(int j = 1;j <= tot && i * prime[j] <= 10000; j++)
{
vis[i * prime[j]] = 1;
if(i % prime[j] == 0)
break;
}
}
}
int Two(int l,int r,int n)
{
int mid;
while(l < r)
{
mid = l + (r - l) / 2;
if(mid * mid * mid < n)
l = mid + 1;
else
{
if(mid * mid * mid > n)
r = mid - 1;
else
return mid;
}
}
return l;
}
signed main()
{
//freopen("in","r",stdin);
int t,n;
t = read();
Prime();
while(t--)
{
n = read();
int ans = inf;
for(int i = 1;i <= tot; i++)
{
int p = prime[i];
if (n % p == 0)
{
int num = 0;
while (n % p == 0)
{
num++;
n /= p;
}
ans = min(ans, num);
}
}
if(n != 1)
{
int nn = (int)sqrt(n);
if(nn * nn == n)
{
int nnnn = (int)sqrt(nn);
if(nnnn * nnnn == nn)
ans = min(ans,1ll * 4);
else
ans = min(ans,1ll * 2);
}
else
{
int nnn = Two(1,1e6,n);
if(nnn * nnn * nnn == n)
ans = min(ans,1ll * 3);
else
ans = 1;
}
}
printf("%lld\n",ans);
}
return 0;
}