Автор задачі: | AlKaosar Hussain |
Підготовлено: | AlKaosar Hussain |
Редагував: | Hasan Saleh (MathModel) |
Розв'язок
Тут перше значення послідовності , а останнє значення , і всі інші сусідні
значення ділять один одного, а їх співвідношення є простим числом. Нехай розклад на прості множники
Тепер основне спостереження полягає в тому, що на кожному кроці ви множите поточне число a_i на точно один простий
p_j, і кожен простий p_j зустрічається c_j разів у , оскільки ви можете множити лише на один простий за раз,
кожен показник простого повинен додаватися по одному, тому загальна кількість кроків, щоб досягти n=\sum c_i. Включаючи початок з ,
максимальна довжина послідовності = 1+\sum c_i.
Тепер у вас є c_i копій p_i, на кожному кроці в послідовності потрібно вибрати одну копію простого і помножити її,
оскільки порядок має значення, адже різні порядки дають різні послідовності, тому загальна кількість кроків, не враховуючи
початковий 1=\sum c_i. А кількість різних послідовностей =
що є мультиномиальним коефіцієнтом, і це відповідь.
MOD = 10**9 + 7
MAXN = 10000
fact = [1] * (MAXN + 1)
invfact = [1] * (MAXN + 1)
for i in range(2, MAXN + 1):
fact[i] = fact[i - 1] * i % MOD
invfact[MAXN] = pow(fact[MAXN], MOD - 2, MOD)
for i in range(MAXN, 0, -1):
invfact[i - 1] = invfact[i] * i % MOD
def prime(n):
factors = {}
x = n
p = 2
while p * p <= x:
while x % p == 0:
factors[p] = factors.get(p, 0) + 1
x //= p
p += 1
if x > 1:
factors[x] = factors.get(x, 0) + 1
return factors
def multinomial(exp):
total = sum(exp)
if total == 0:
return -1
res = fact[total]
for e in exp:
res = res * invfact[e] % MOD
return total, res
def solve(n):
factors = prime(n)
exp = list(factors.values())
return multinomial(exp)
for _ in range(int(input())):
n = int(input())
if n == 1:
print(1,1)
continue
a, b = solve(n)
print(b % MOD,a+1)