Автор задачі: | De3b0o |
Підготував: | De3b0o |
Редагував: | MathModel |
Розв'язання
Щоб перетворити на , використовуючи лише множення на цілі числа z > 1, мають виконуватися дві основні умови:
має ділитися на . Якщо y \pmod x \neq 0, досягти з неможливо, тому відповідь — NO (якщо тільки x=y і k=0).
Ми повинні мати можливість розкласти відношення Q = y/x рівно на множників, кожен з яких більший за .
Нехай Q = y/x.
Якщо Q = 1 (тобто x=y): ми можемо отримати лише за k=0 операцій. Якщо k > 0, відповідь — NO, оскільки кожна операція повинна множити щонайменше на 2, а отже значення буде строго зростати.
Якщо Q > 1:
Мінімальна кількість операцій дорівнює (якщо вибрати z = Q).
Максимальна кількість операцій дорівнює загальній кількості простих множників числа . Позначимо її через . Наприклад, якщо Q = 12, то прості множники — це 2 \times 2 \times 3, тому M=3.
Будь-яка кількість операцій , така що 1 \le k \le M, є можливою. Це тому, що ми завжди можемо взяти набір із множників і перемножити будь-які два з них, щоб зменшити кількість множників на 1, доки не отримаємо один множник .
Складність для одного набору вхідних даних становить O(\sqrt{y/x}) для знаходження розкладу на прості множники.
for _ in range(int(input())):
x,y,k=map(int,input().split())
if k==0:
print("YES" if x==y else "NO")
continue
c=0
i=2
while i<=100000:
c1=c2=0
while x%i==0:
x//=i
c1+=1
while y%i==0:
y//=i
c2+=1
if c1>c2:
c=-10**18
c+=c2-c1
i+=1
print("YES" if c>=k else "NO")