aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc 110 D - Factorization (python)

題名からし素因数分解するのは間違いないとして、約数の積が何通り作れるかを考えるのだが…
頭が固くて自力では解けなかった。解説AC
例えば n=4 , m=360 (2^3*3^2*5^1) とすると答えとなるものは
A1*A2*A3*A4 = 360 となるものであるが、
A1 は 360の約数なので、2^p1*3^q1*5^r1 の形をしている。(p1<= 3, q1<= 2, r1<= 1)
同様に A2~A4 まで考えれば、
A1*A2*A3*A4 = 2^(p1+p2+p3+p4)*3^(q1+q2+q3+q4)*5^(r1+r2+r3+r4)
となり、これが 360 となる条件は
p1+p2+p3+p4 = 3, q1+q2+q3+q4 = 2, r1+r2+r3+r4 = 1 なので
求める個数は、n 個から r 個重複を許して取り出す組み合わせを nHr とおくと、
4H3 * 4H2 * 4H1 である。
また nHr = (n+r-1)Cr である。
賢い。

def factorization(n):
    arr = []
    temp = n
    for i in range(2, int(-(-n**0.5//1))+1):
        if temp%i==0:
            cnt=0
            while temp%i==0:
                cnt+=1
                temp //= i
            arr.append([i, cnt])
    if temp!=1:
        arr.append([temp, 1])
    if arr==[]:
        arr.append([n, 1])
    return arr
  
n,m = map(int,input().split())
chk = factorization(m)
from scipy.misc import comb

mod = 10**9+7
ans = 1
if m > 1:
  for i in chk:
    ans *= comb(i[1]+n-1,i[1],mod)
    ans %= mod
print(ans)