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 N=1e6;
const ll MOD=1e9+7;
ll n,m,inv[N],F[N],Finv[N];

void init(){
    inv[1] = 1;
    for(int i = 2; i < N; i ++){
        inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
    }
    F[0] = Finv[0] = 1;
    for(int i = 1; i < N; i ++){
        F[i] = F[i-1] * 1ll * i % MOD;
        Finv[i] = Finv[i-1] * 1ll * inv[i] % MOD;
    }
}
ll comb(ll n, ll m){//comb(n, m)就是C(n, m)
    if(m < 0 || m > n) return 0;
    return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD;
}

map<ll,ll>cnt;
//ll dp[100005][30][30];
//ll work(ll x){
//    if(x<=0&&(cnt[2]||cnt[3]))  return 0;
//    memset(dp,0,sizeof dp);
//    dp[0][0][0]=1;
//    for(int i=1;i<=x;i++){
//        for(int a=0;a<=cnt[2];a++){
//            for(int b=0;b<=cnt[3];b++){
//                for(int ua=0;ua<=a;ua++){
//                    for(int ub=0;ub<=b;ub++){
//                        dp[i][a][b]+=dp[i-1][a-ua][b-ub];
//                    }
//                }
//            }
//        }
//    }
////    cout << dp[1][1][1]<<endl;
//    return dp[x][cnt[2]][cnt[3]];
//}

int main(){
    cin >>n >> m;
    cnt.clear();
    for(int i=2;i<=m;i++){
        if(m%i==0)  while(m%i==0)   m/=i,cnt[i]++;
    }
    if(m>1) cnt[m]++;
    init();

    ll ans=1ll;
    for(auto t : cnt){
        ll v=t.second;
//        cout <<t.first<<" "<< v << endl;
        ans=ans*comb(n+v-1,n-1)%MOD;
    }
    cout << ans << endl;

    return 0;
}