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 <iostream>
#include <map>
#include <utility>
#include <cmath>

void prime_factorization(std::map<long, long> &prime_factor, long M);
long modinv(long a, long m);
long nCr(long n, long r);

int main()
{
  long N, M;
  std::cin >> N >> M;
  std::map<long, long> prime_factor;
  prime_factorization(prime_factor, M);
  long ans = 1;
  for (auto x : prime_factor)
  {
    ans *= nCr((N-1+x.second), x.second);
    ans %= 1000000007;
  }
  std::cout << ans << std::endl;
}

/* ++++++++++ function ++++++++++ */
void prime_factorization(std::map<long, long> &prime_factor, long M)
{
  long num;
  double limit = std::sqrt(M);
  for (int i = 2; i < limit; i++)
  {
    num = 0;
    if (M % i == 0)
    {
      while (M % i == 0)
      {
        num++;
        M /= i;
      }
      prime_factor[i] = num;
    }
    if (i != 2) i++;
  }
  if (M != 1) prime_factor[M] = 1;
}

long modinv(long a, long m) {
    long b = m, u = 1, v = 0;
    while (b) {
        long long t = a / b;
        a -= t * b; std::swap(a, b);
        u -= t * v; std::swap(u, v);
    }
    u %= m;
    if (u < 0) u += m;
    return u;
}

long nCr(long n, long r){
  long ans = 1;
  for(long i = n; i > n - r; i--){
    ans = ans*i;
    ans %= 1000000007;
  }
  for(long i = 1; i < r + 1; i++){
    ans *= modinv(i, 1000000007);
    ans %= 1000000007;
  }
  return ans;
}