Problem:
Score : 400 points

Problem Statement

You are given positive integers N and M.

How many sequences a of length N consisting of positive integers satisfy a_1 \times a_2 \times ... \times a_N = M? Find the count modulo 10^9+7.

Here, two sequences a' and a'' are considered different when there exists some i such that a_i' \neq a_i''.

Constraints

All values in input are integers.

1 \leq N \leq 10^5

1 \leq M \leq 10^9

Input

Input is given from Standard Input in the following format:

N M

Output

Print the number of the sequences consisting of positive integers that satisfy the condition, modulo 10^9 + 7.

Sample Input 1

2 6

Sample Output 1

4

Four sequences satisfy the condition: \{a_1, a_2\} = \{1, 6\}, \{2, 3\}, \{3, 2\} and \{6, 1\}.

Sample Input 2

3 12

Sample Output 2

18

Sample Input 3

100000 1000000000

Sample Output 3

957870001

Solution in Fortran (gfortran v4.8.4) (judge verdict: Accepted)

program abc110d
  implicit none
  integer(8), parameter :: modulo = 10**9 + 7
  integer(8) :: ans = 1, i = 2
  integer(8) n, m, count

  read *, n, m
  do
     if (m < i * i) exit
     if (mod(m, i) == 0) then
        count = 0
        do
           m = m / i;
           count = count + 1
           if (mod(m, i) /= 0) exit
        end do
        ans = mod(ans * comb(n + count - 1, count, modulo), modulo)
     end if
     i = i + 1
  end do
  if (m /= 1) then
     ans = mod(ans * n, modulo)
  end if
  print '(i0)', ans

contains

  recursive integer(8) function comb(n, k, m) result(r)
    integer(8), intent(in) :: n, k, m
    integer(8) i, nume, deno

    if (n - k < k) then
       r = comb(n, n - k, m)
    else
       nume = 1
       deno = 1
       do i = 0, k - 1
          nume = mod(nume * (n - i), m)
          deno = mod(deno * (i + 1), m)
       end do
       r = mod(nume * modpow(deno, m - 2, m), m)
    end if
  end function comb

  recursive integer(8) function modpow(a, p, m) result(r)
    integer(8), intent(in) :: a, p, m

    if (p == 0) then
       r = 1
    else if (mod(p, 2) == 0) then
       r = mod(modpow(a, p / 2, m)**2, m)
    else
       r = mod(a * modpow(a, p - 1, m), m)
    end if
  end function modpow

end program abc110d