Problem Müəllifi: | AlKaosar Hussain |
Hazırlayan: | AlKaosar Hussain |
Redaktə edən: | Hasan Saleh (MathModel) |
Həll
Burada ardıcıllığın ilk dəyəri -dir və son dəyəri -dir, qalan hər bitişik
dəyər bir-birini bölür və onların nisbəti asal ədəd olmalıdır, indi asal faktorizasiyanı
götürək.
İndi əsas müşahidə odur ki, hər addımda cari ədəd a_i-ni dəqiq bir asal ədəd p_j ilə vurursunuz
və hər bir asal p_j -də c_j dəfə baş verir, çünki siz bir vaxtda bir asal ilə vurursunuz,
hər bir asalın eksponenti bir-bir əlavə edilməlidir, beləliklə -ə çatmaq üçün toplam addımlar n=\sum c_i-dir. -dən başlayaraq
maksimum ardıcıllıq uzunluğu = 1+\sum c_i.
İndi sizdə c_i ədəd p_i var, ardıcıllıqda hər addımda bir asal nüsxəsini seçməli və onu vurmalısınız
çünki sıralama əhəmiyyətlidir, çünki fərqli sıralamalar fərqli ardıcıllıqlar yaradır, beləliklə, başlanğıc 1=\sum c_i-ni istisna edərək toplam addımlar
və fərqli ardıcıllıqların sayı =
bu, multinomial koeffisiyentdir və cavab budur.
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)