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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;

#define MOD 1000000007

void factorize(map<long long, long long> &factor, long long x)
{
    for (long long i = 2; i * i <= x; i++)
    {
        while (x % i == 0)
        {
            x /= i;
            factor[i]++;
        }
        if (x == 1)
        {
            break;
        }
    }
    if (x != 1)
    {
        factor[x]++;
    }
}

long long mul_mod(long long x, long long y, long long mod)
{
    return (x * y) % mod;
}

long long inv_mod(long long x, long long mod)
{
    long long y = mod;
    long long u = 1;
    long long v = 0;
    while (y)
    {
        long long t = x / y;
        x -= t * y;
        swap(x, y);
        u -= t * v;
        swap(u, v);
    }
    u %= mod;
    if (u < 0)
        u += mod;
    return u;
}

long long div_mod(long long x, long long y, long long mod)
{
    return mul_mod(x, inv_mod(y, mod), mod);
}

long long calcPermutation(long long x, long long y, long long mod)
{
    long long ans = 1;
    for (long long i = 0; i < y; i++)
    {
        ans = mul_mod(ans, x - i, mod);
    }
    return ans;
}

long long calcCombination(long long x, long long y, long long mod)
{
    if ((x - y) < y)
    {
        y = x - y;
    }
    long long ans = calcPermutation(x, y, mod);
    while (y > 0)
    {
        ans = div_mod(ans, y, mod);
        y--;
    }
    return ans;
}

long long calcPatarn(long long fact, long long n, long long mod)
{
    long long ans;
    if (fact > 0)
    {
        ans = calcCombination(fact + (n - 1), fact, mod);
    }
    else
    {
        ans = 1;
    }
    return ans;
}

int main()
{
    long long N, M;
    cin >> N >> M;
    map<long long, long long> factor;
    factorize(factor, M);
    long long ans = 1;
    for (auto x : factor)
    {
        ans = mul_mod(ans, calcPatarn(x.second, N, MOD), MOD);
    }
    cout << ans << endl;
}