import sys

from collections import deque

import copy



def power_func(a,b,p):

  if b==0: return 1

  if b%2==0:

    d=power_func(a,b//2,p)

    return d*d %p

  if b%2==1:

    return (a*power_func(a,b-1,p ))%p





class comb_calclator():

    def __init__(self, N, p):

        self.N = N

        self.p = p

        self.frac_N = [0 for i in range(N + 1)]

        self.frac_N[0] = 1

        self.comb_N = {}

        for i in range(1, N + 1):

            self.frac_N[i] = (self.frac_N[i - 1] * i ) % p



    def comb(self, n, r):

        if n<0 or r<0 or n<r: return 0

        if n==0 or r==0: return 1

        if (n, r) in self.comb_N:

            return self.comb_N[(n, r)]

        a = self.frac_N[n]

        b = self.frac_N[r]

        c = self.frac_N[n - r]

        self.comb_N[(n, r)] = (a*power_func(b,self.p-2,self.p)*power_func(c,self.p-2, self.p))% self.p

        self.comb_N[(n, n - r)] = self.comb_N[(n, r)]

        return self.comb_N[(n, r)]





def prime_decomposition(n):

  i = 2

  table = []

  while i * i <= n:

    while n % i == 0:

      n /= i

      table.append(i)

    i += 1

  if n > 1:

    table.append(n)

  return table



def get_read_func(fileobject):

    if fileobject == None :

        return raw_input

    else:

        return fileobject.readline





def main():

    if len(sys.argv) > 1:

        f = open(sys.argv[1])

    else:

        f = None

    read_func = get_read_func(f);

    input_raw = read_func().strip().split()

    [N, M] = [int(input_raw[0]), int(input_raw[1])]



    prime_table = prime_decomposition(M)

    primes = {}

    for p in prime_table:

        if p in primes:

            primes[p] += 1

        else:

            primes[p] = 1



    cmb = comb_calclator(10 * N, int(1e+9) + 7)

    count = 1

    for p in primes:

        b = primes[p]

        count = (count * cmb.comb(b + N - 1, b))%(int(1e+9) + 7)





    print(count)







if __name__ == '__main__':

    main()

import sys

from collections import deque

import copy



def power_func(a,b,p):

  if b==0: return 1

  if b%2==0:

    d=power_func(a,b//2,p)

    return d*d %p

  if b%2==1:

    return (a*power_func(a,b-1,p ))%p





class comb_calclator():

    def __init__(self, N, p):

        self.N = N

        self.p = p

        self.frac_N = [0 for i in range(N + 1)]

        self.frac_N[0] = 1

        self.comb_N = {}

        for i in range(1, N + 1):

            self.frac_N[i] = (self.frac_N[i - 1] * i ) % p



    def comb(self, n, r):

        if n<0 or r<0 or n<r: return 0

        if n==0 or r==0: return 1

        if (n, r) in self.comb_N:

            return self.comb_N[(n, r)]

        a = self.frac_N[n]

        b = self.frac_N[r]

        c = self.frac_N[n - r]

        self.comb_N[(n, r)] = (a*power_func(b,self.p-2,self.p)*power_func(c,self.p-2, self.p))% self.p

        self.comb_N[(n, n - r)] = self.comb_N[(n, r)]

        return self.comb_N[(n, r)]





def prime_decomposition(n):

  i = 2

  table = []

  while i * i <= n:

    while n % i == 0:

      n /= i

      table.append(i)

    i += 1

  if n > 1:

    table.append(n)

  return table



def get_read_func(fileobject):

    if fileobject == None :

        return raw_input

    else:

        return fileobject.readline





def main():

    if len(sys.argv) > 1:

        f = open(sys.argv[1])

    else:

        f = None

    read_func = get_read_func(f);

    input_raw = read_func().strip().split()

    [N, M] = [int(input_raw[0]), int(input_raw[1])]



    prime_table = prime_decomposition(M)

    primes = {}

    for p in prime_table:

        if p in primes:

            primes[p] += 1

        else:

            primes[p] = 1



    max_num = 0

    for p in primes:

        max_num = max(max_num, primes[p])



    cmb = comb_calclator(max_num + N, int(1e+9) + 7)

    count = 1

    for p in primes:

        b = primes[p]

        count = (count * cmb.comb(b + N - 1, b))%(int(1e+9) + 7)





    print(count)







if __name__ == '__main__':

    main()

import sys
from collections import deque
import copy


def power_func(a, b, p):
    if b == 0:
        return 1
    if b % 2 == 0:
        d = power_func(a, b // 2, p)
        return d * d % p
    if b % 2 == 1:
        return (a * power_func(a, b - 1, p)) % p


class comb_calclator:
    def __init__(self, N, p):
        self.N = N
        self.p = p
        self.frac_N = [0 for i in range(N + 1)]
        self.frac_N[0] = 1
        self.comb_N = {}
        for i in range(1, N + 1):
            self.frac_N[i] = (self.frac_N[i - 1] * i) % p

    def comb(self, n, r):
        if n < 0 or r < 0 or n < r:
            return 0
        if n == 0 or r == 0:
            return 1
        if (n, r) in self.comb_N:
            return self.comb_N[(n, r)]
        a = self.frac_N[n]
        b = self.frac_N[r]
        c = self.frac_N[n - r]
        self.comb_N[(n, r)] = (
            a * power_func(b, self.p - 2, self.p) * power_func(c, self.p - 2, self.p)
        ) % self.p
        self.comb_N[(n, n - r)] = self.comb_N[(n, r)]
        return self.comb_N[(n, r)]


def prime_decomposition(n):
    i = 2
    table = []
    while i * i <= n:
        while n % i == 0:
            n /= i
            table.append(i)
        i += 1
    if n > 1:
        table.append(n)
    return table


def get_read_func(fileobject):
    if fileobject == None:
        return raw_input
    else:
        return fileobject.readline


def main():
    if len(sys.argv) > 1:
        f = open(sys.argv[1])
    else:
        f = None
    read_func = get_read_func(f)
    input_raw = read_func().strip().split()
    [N, M] = [int(input_raw[0]), int(input_raw[1])]
    prime_table = prime_decomposition(M)
    primes = {}
    for p in prime_table:
        if p in primes:
            primes[p] += 1
        else:
            primes[p] = 1
    cmb = comb_calclator(10 * N, int(1e9) + 7)
    count = 1
    for p in primes:
        b = primes[p]
        count = (count * cmb.comb(b + N - 1, b)) % (int(1e9) + 7)
    print(count)


if __name__ == "__main__":
    main()

import sys
from collections import deque
import copy


def power_func(a, b, p):
    if b == 0:
        return 1
    if b % 2 == 0:
        d = power_func(a, b // 2, p)
        return d * d % p
    if b % 2 == 1:
        return (a * power_func(a, b - 1, p)) % p


class comb_calclator:
    def __init__(self, N, p):
        self.N = N
        self.p = p
        self.frac_N = [0 for i in range(N + 1)]
        self.frac_N[0] = 1
        self.comb_N = {}
        for i in range(1, N + 1):
            self.frac_N[i] = (self.frac_N[i - 1] * i) % p

    def comb(self, n, r):
        if n < 0 or r < 0 or n < r:
            return 0
        if n == 0 or r == 0:
            return 1
        if (n, r) in self.comb_N:
            return self.comb_N[(n, r)]
        a = self.frac_N[n]
        b = self.frac_N[r]
        c = self.frac_N[n - r]
        self.comb_N[(n, r)] = (
            a * power_func(b, self.p - 2, self.p) * power_func(c, self.p - 2, self.p)
        ) % self.p
        self.comb_N[(n, n - r)] = self.comb_N[(n, r)]
        return self.comb_N[(n, r)]


def prime_decomposition(n):
    i = 2
    table = []
    while i * i <= n:
        while n % i == 0:
            n /= i
            table.append(i)
        i += 1
    if n > 1:
        table.append(n)
    return table


def get_read_func(fileobject):
    if fileobject == None:
        return raw_input
    else:
        return fileobject.readline


def main():
    if len(sys.argv) > 1:
        f = open(sys.argv[1])
    else:
        f = None
    read_func = get_read_func(f)
    input_raw = read_func().strip().split()
    [N, M] = [int(input_raw[0]), int(input_raw[1])]
    prime_table = prime_decomposition(M)
    primes = {}
    for p in prime_table:
        if p in primes:
            primes[p] += 1
        else:
            primes[p] = 1
    max_num = 0
    for p in primes:
        max_num = max(max_num, primes[p])
    cmb = comb_calclator(max_num + N, int(1e9) + 7)
    count = 1
    for p in primes:
        b = primes[p]
        count = (count * cmb.comb(b + N - 1, b)) % (int(1e9) + 7)
    print(count)


if __name__ == "__main__":
    main()

-    cmb = comb_calclator(10 * N, int(1e9) + 7) +    max_num = 0 +    for p in primes: +        max_num = max(max_num, primes[p]) +    cmb = comb_calclator(max_num + N, int(1e9) + 7)