Помогите решить задачу. Степени

Пробовал много вариантов, но все они не укладывались в отведённое время. На мой взгляд этот самый близкий к решению. Всё что находил в Google тоже не работало.

Для того чтобы проверить, как её ученики умеют считать, Мария Ивановна каждый год задаёт им на дом одну и ту же задачу — для заданного натурального A найти минимальное натуральное N такое, что N в степени N (N, умноженное на себя N раз) делится на A. От года к году и от ученика к ученику меняется только число A.

Вы решили помочь будущим поколениям. Для этого вам необходимо написать программу, решающую эту задачу.

Входные данные:

Во входном файле содержится единственное число A (1≤A≤10⁹ — на всякий случай; вдруг Мария Ивановна задаст большое число, чтобы «завалить» кого-нибудь…).

Выходные данные:

В выходной файл вывести единственное число N.

Примеры

Ввод 8 Вывод 4

Ввод 1 Вывод 1

def mn(n):
    lst = []
    i = 2
    while n != 1:
        if n % i == 0:
            n = n // i
            lst.append(i)
            continue
        i += 1
    return lst


x = int(input())
r = mn(x)
y = 2

for i in range(1, len(r)):
    if r[i] != r[i - 1]:
        y = r[i] * y
    i += 1

if x == 1:
    print(1)
else:
    if y >= 29:
        print(y)
    else:
        for k in range(2, 28):
            if x % (y * k) == 0:
                print(k * y)
                break
            k += 1

Ответы (3 шт):

Автор решения: RomanR
def Factor(n):
    Ans = []
    d = 2
    while d * d <= n:
        if n % d == 0:
            Ans.append(d)
            n //= d
        else:
            d += 1
    if n > 1:
        Ans.append(n)
    return Ans


lst = Factor(int(input()))
s = set(lst)

num = 1
for i in s:
    a = lst.count(i)
    temp = i
    while temp < a:
        a = a % 2 + a // 2
        temp *= i
    num *= temp
print(num)
→ Ссылка
Автор решения: Danis
def f(a):
    lst = []
    i = 2
    while a != 1:
        if a % i == 0:
            lst.append(i)
            a /= i
            continue
        i += 1
    return lst

a = int(input())
b = f(a)
    
n = 1
for i in set(b):
    n *= i

for i in b:
    if (n * i) ** (n * i) % a == 0:
        print(i * n)
        break
else:
    print(None)
→ Ссылка
Автор решения: ResDT

Представляю относительно краткое решение:

def minimum_number(number_A):
    list_ = []

    for number in range(1, int(number_A ** 0.5) + 1):
        if not (number_A % number):
            list_.append(number)
            list_.append(number_A // number)

    for element in sorted(list_):
        if element ** element >= number_A:
            return element


print(minimum_number(int(input())))
→ Ссылка