# -*- coding: utf-8 -*-





'''Snippets for prime.

Available functions:

- is_included: Determine whether it is a prime number.

- generate: Generate a list of prime numbers using sieve of Eratosthenes.

'''





class Prime(object):

    '''Represents a snippet for prime numbers.

    '''



    def __init__(self, number):

        self.number = number

        self._values = []



    def is_included(self) -> bool:

        '''Determine whether it is a prime number.

        Args:

            number: Int of number (greater than 0).

        Returns:

            True if the input number was prime.

            False if the input number was not prime.

        See:

            https://qiita.com/srtk86/items/874639e361917e5016d4

            https://docs.python.org/ja/3/library/2to3.html?highlight=isinstance#2to3fixer-isinstance

        '''



        from math import sqrt



        if (self.number <= 1) or (isinstance(self.number, float)):

            return False



        for i in range(2, int(sqrt(self.number)) + 1):

            if self.number % i == 0:

                return False



        return True



    def generate(self) -> list:

        '''Generate a list of prime numbers using sieve of Eratosthenes.

        Returns:

            A list of prime numbers that is eqaul to or less than the input

            number.

        Landau notation: O(n log log n)

        See:

            https://beta.atcoder.jp/contests/abc110/submissions/3254947

        '''



        if self._values:

            return self._values



        is_met = [True for _ in range(self.number + 1)]

        is_met[0] = False

        is_met[1] = False



        for i in range(2, self.number + 1):

            if is_met[i]:

                self._values.append(i)



                for j in range(2 * i, self.number + 1, i):

                    is_met[j] = False

        return self._values





def count_combinations(n, k, mod):

    ans = 1



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

        ans *= n - i + 1

        ans %= mod

        ans *= pow(i, mod - 2, mod)

        ans %= mod



    return ans





def main():

    from math import sqrt



    n, m = list(map(int, input().split()))

    _prime = Prime(int(sqrt(m)) + 1)

    primes = _prime.generate()

    mod = 10 ** 9 + 7

    ans = 1



    for prime in primes:

        count = 0



        while m % prime == 0:

            count += 1

            m //= prime



        ans *= count_combinations(n + count - 1, count, mod)

        ans %= mod



    if m != 1:

        ans *= count_combinations(n, 1, mod)

        ans %= mod



    print(ans)





if __name__ == '__main__':

    main()

# -*- coding: utf-8 -*-



mod = 10 ** 9 + 7





'''Snippets for combination.



Available functions:

- count_combination: Count the total number of combinations.

'''





def count_combination(n: int, r: int, mod: int = 10 ** 9 + 7) -> int:

    '''Count the total number of combinations.

        nCr % mod.



    Args:

        n   : Elements. Int of number (greater than 1).

        r   : The number of r-th combinations. Int of number (greater than 0).

        mod : Modulo. The default is 10 ** 9 + 7.



    Returns:

        The total number of combinations.



    Landau notation: O(n)



    See:

    https://qiita.com/derodero24/items/91b6468e66923a87f39f

    '''



    if r > (n - r):

        return count_combination(n, n - r)



    if r == 0 or r == n:

        return 1



    if r == 1:

        return n



    multiple = 1

    division = 1



    for i in range(r):

        multiple *= n - i

        division *= i + 1

        multiple %= mod

        division %= mod



    return multiple * pow(division, mod - 2, mod) % mod





def solve(n: int, m: int):

    from math import sqrt



    ans = 1

    remain = m



    for j in range(2, int(sqrt(m)) + 1):

        if remain % j == 0:

            count = 0



            while remain % j == 0:

                count += 1

                remain //= j



            ans *= count_combination(n + count - 1, n - 1)

            ans %= mod



    if remain != 1:

        ans *= count_combination(n, 1)

        ans %= mod



    return ans





def main():

    n, m = list(map(int, input().split()))



    # See:

    # https://www.youtube.com/watch?v=gdQxKESnXKs

    print((solve(n, m)))





if __name__ == '__main__':

    main()

# -*- coding: utf-8 -*-
"""Snippets for prime.
Available functions:
- is_included: Determine whether it is a prime number.
- generate: Generate a list of prime numbers using sieve of Eratosthenes.
"""


class Prime(object):
    """Represents a snippet for prime numbers."""

    def __init__(self, number):
        self.number = number
        self._values = []

    def is_included(self) -> bool:
        """Determine whether it is a prime number.
        Args:
            number: Int of number (greater than 0).
        Returns:
            True if the input number was prime.
            False if the input number was not prime.
        See:
            https://qiita.com/srtk86/items/874639e361917e5016d4
            https://docs.python.org/ja/3/library/2to3.html?highlight=isinstance#2to3fixer-isinstance
        """
        from math import sqrt

        if (self.number <= 1) or (isinstance(self.number, float)):
            return False
        for i in range(2, int(sqrt(self.number)) + 1):
            if self.number % i == 0:
                return False
        return True

    def generate(self) -> list:
        """Generate a list of prime numbers using sieve of Eratosthenes.
        Returns:
            A list of prime numbers that is eqaul to or less than the input
            number.
        Landau notation: O(n log log n)
        See:
            https://beta.atcoder.jp/contests/abc110/submissions/3254947
        """
        if self._values:
            return self._values
        is_met = [True for _ in range(self.number + 1)]
        is_met[0] = False
        is_met[1] = False
        for i in range(2, self.number + 1):
            if is_met[i]:
                self._values.append(i)
                for j in range(2 * i, self.number + 1, i):
                    is_met[j] = False
        return self._values


def count_combinations(n, k, mod):
    ans = 1
    for i in range(1, k + 1):
        ans *= n - i + 1
        ans %= mod
        ans *= pow(i, mod - 2, mod)
        ans %= mod
    return ans


def main():
    from math import sqrt

    n, m = list(map(int, input().split()))
    _prime = Prime(int(sqrt(m)) + 1)
    primes = _prime.generate()
    mod = 10**9 + 7
    ans = 1
    for prime in primes:
        count = 0
        while m % prime == 0:
            count += 1
            m //= prime
        ans *= count_combinations(n + count - 1, count, mod)
        ans %= mod
    if m != 1:
        ans *= count_combinations(n, 1, mod)
        ans %= mod
    print(ans)


if __name__ == "__main__":
    main()

# -*- coding: utf-8 -*-
mod = 10**9 + 7
"""Snippets for combination.
Available functions:
- count_combination: Count the total number of combinations.
"""


def count_combination(n: int, r: int, mod: int = 10**9 + 7) -> int:
    """Count the total number of combinations.
        nCr % mod.
    Args:
        n   : Elements. Int of number (greater than 1).
        r   : The number of r-th combinations. Int of number (greater than 0).
        mod : Modulo. The default is 10 ** 9 + 7.
    Returns:
        The total number of combinations.
    Landau notation: O(n)
    See:
    https://qiita.com/derodero24/items/91b6468e66923a87f39f
    """
    if r > (n - r):
        return count_combination(n, n - r)
    if r == 0 or r == n:
        return 1
    if r == 1:
        return n
    multiple = 1
    division = 1
    for i in range(r):
        multiple *= n - i
        division *= i + 1
        multiple %= mod
        division %= mod
    return multiple * pow(division, mod - 2, mod) % mod


def solve(n: int, m: int):
    from math import sqrt

    ans = 1
    remain = m
    for j in range(2, int(sqrt(m)) + 1):
        if remain % j == 0:
            count = 0
            while remain % j == 0:
                count += 1
                remain //= j
            ans *= count_combination(n + count - 1, n - 1)
            ans %= mod
    if remain != 1:
        ans *= count_combination(n, 1)
        ans %= mod
    return ans


def main():
    n, m = list(map(int, input().split()))
    # See:
    # https://www.youtube.com/watch?v=gdQxKESnXKs
    print((solve(n, m)))


if __name__ == "__main__":
    main()

-"""Snippets for prime. +mod = 10**9 + 7 +"""Snippets for combination. -- is_included: Determine whether it is a prime number. -- generate: Generate a list of prime numbers using sieve of Eratosthenes. +- count_combination: Count the total number of combinations. -class Prime(object): -    """Represents a snippet for prime numbers.""" - -    def __init__(self, number): -        self.number = number -        self._values = [] - -    def is_included(self) -> bool: -        """Determine whether it is a prime number. -        Args: -            number: Int of number (greater than 0). -        Returns: -            True if the input number was prime. -            False if the input number was not prime. -        See: -            https://qiita.com/srtk86/items/874639e361917e5016d4 -            https://docs.python.org/ja/3/library/2to3.html?highlight=isinstance#2to3fixer-isinstance -        """ -        from math import sqrt - -        if (self.number <= 1) or (isinstance(self.number, float)): -            return False -        for i in range(2, int(sqrt(self.number)) + 1): -            if self.number % i == 0: -                return False -        return True - -    def generate(self) -> list: -        """Generate a list of prime numbers using sieve of Eratosthenes. -        Returns: -            A list of prime numbers that is eqaul to or less than the input -            number. -        Landau notation: O(n log log n) -        See: -            https://beta.atcoder.jp/contests/abc110/submissions/3254947 -        """ -        if self._values: -            return self._values -        is_met = [True for _ in range(self.number + 1)] -        is_met[0] = False -        is_met[1] = False -        for i in range(2, self.number + 1): -            if is_met[i]: -                self._values.append(i) -                for j in range(2 * i, self.number + 1, i): -                    is_met[j] = False -        return self._values +def count_combination(n: int, r: int, mod: int = 10**9 + 7) -> int: +    """Count the total number of combinations. +        nCr % mod. +    Args: +        n   : Elements. Int of number (greater than 1). +        r   : The number of r-th combinations. Int of number (greater than 0). +        mod : Modulo. The default is 10 ** 9 + 7. +    Returns: +        The total number of combinations. +    Landau notation: O(n) +    See: +    https://qiita.com/derodero24/items/91b6468e66923a87f39f +    """ +    if r > (n - r): +        return count_combination(n, n - r) +    if r == 0 or r == n: +        return 1 +    if r == 1: +        return n +    multiple = 1 +    division = 1 +    for i in range(r): +        multiple *= n - i +        division *= i + 1 +        multiple %= mod +        division %= mod +    return multiple * pow(division, mod - 2, mod) % mod -def count_combinations(n, k, mod): +def solve(n: int, m: int): +    from math import sqrt + -    for i in range(1, k + 1): -        ans *= n - i + 1 -        ans %= mod -        ans *= pow(i, mod - 2, mod) +    remain = m +    for j in range(2, int(sqrt(m)) + 1): +        if remain % j == 0: +            count = 0 +            while remain % j == 0: +                count += 1 +                remain //= j +            ans *= count_combination(n + count - 1, n - 1) +            ans %= mod +    if remain != 1: +        ans *= count_combination(n, 1) -    from math import sqrt - -    _prime = Prime(int(sqrt(m)) + 1) -    primes = _prime.generate() -    mod = 10**9 + 7 -    ans = 1 -    for prime in primes: -        count = 0 -        while m % prime == 0: -            count += 1 -            m //= prime -        ans *= count_combinations(n + count - 1, count, mod) -        ans %= mod -    if m != 1: -        ans *= count_combinations(n, 1, mod) -        ans %= mod -    print(ans) +    # See: +    # https://www.youtube.com/watch?v=gdQxKESnXKs +    print((solve(n, m)))