被思维题整的死去活来,用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;
}