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;
typedef long long ll;
const int MOD = 1000000007;

#define REP(i,n) for((i)=0;(i)<(int)(n);(i)++)

// 素因数分解による指数の列挙
vector<int> factor(int n){
    vector<int> res;
    for (int i = 2; i * i <= n; i++){
        int cnt = 0;
        while(n % i == 0){
            cnt++;
            n /= i;
        }
        res.push_back(cnt);
    }
    if (n != 1) res.push_back(1);
    return res;
}

const int MAX = 100100;
ll fact[MAX], finv[MAX], inv[MAX];
void init_combination(int p){
    fact[0] = fact[1] = finv[0] = finv[1] = inv[1] = 1;
    for (int i = 2; i < MAX; i++){
        fact[i] = i * fact[i - 1] % p;
        inv[i] = p - inv[p % i] * (p / i) % p;
        finv[i] = inv[i] * finv[i - 1] % p;
    }
}

ll combination(int n, int k, int p){
    if (n < k || n < 0 || k < 0) return 0;
    return fact[n] * (finv[k] * finv[n - k] % p) % p;
}

int main(){
    int n, m;
    cin >> n >> m;
    vector<int> power = factor(m);
    ll ans = 1;
    init_combination(MOD);
    for (int i = 0; i < (int)power.size(); i++){
        (ans *= combination(power[i] + n - 1, n - 1, MOD)) %= MOD;
    }
    
    cout << ans << endl;

    return 0;
}