object Main extends App {
  val sc = new java.util.Scanner(System.in)
  val n,m = sc.nextInt

  val mod = 1000000007

  def plus(a: Long, b: Long): Long = (a+b) % mod
  def minus(a: Long, b: Long): Long = (a-b+mod) % mod
  def times(a: Long, b: Long): Long = (a*b) % mod

  def pow(a: Long, n: Int): Long = {
    def pow(a: Long, n: Int, res: Long): Long = {
      if (n == 0) res
      else if ((n&1) == 0) pow(times(a,a),n >> 1,res)
      else pow(times(a,a),n >> 1,times(a,res))
    }
    pow(a,n,1L)
  }

  def inv(a: Long): Long = pow(a,mod-2)
  def div(a: Long, b: Long): Long = times(a,inv(b))


  def factorize(n: Int): List[Int] = {
    if (n == 1) Nil
    else {
      var i = 2
      var d = 0
      while (i*i <= n && d == 0) {
        if (n % i == 0) d = i
        i += 1
      }
      if (d == 0) List(n) else d::factorize(n/d)
    }
  }

  if (m == 1) println(1)
  else {
    val f = factorize(m)
    val bs = f.toSet.toList.map((x: Int) => f.count(_ == x))

    val l = bs.max + n - 1

    def factTable(n: Int): IndexedSeq[Long] = {
      (1 to n).scanLeft(1L)(times(_,_))
    }

    val fact = factTable(l)

    def factInvTable(n: Int): IndexedSeq[Long] = {
      (1 to n).scanRight(inv(fact(n)))(times(_,_))
    }

    val factInv = factInvTable(l)

    def comb(n: Int, k: Int): Long = {
      times(times(fact(n), factInv(k)), factInv(n-k))
    }

    println(bs.map(b => comb(b+n-1, b)).reduceLeft(times(_,_)))
  }
}
