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)