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: Runtime Error)

#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define ll long long
#define rep(i,n) for(ll i=0;i<(n);i++)
#define pll pair<ll,ll>
#define pq priority_queue
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define lb(c,x) distance(c.begin(),lower_bound(all(c),x))
#define ub(c,x) distance(c.begin(),upper_bound(all(c),x))

using namespace std;

template<class T> inline bool chmax(T& a,T b){if(a<b){a=b;return 1;}return 0;}
template<class T> inline bool chmin(T& a,T b){if(a>b){a=b;return 1;}return 0;}

const ll mod=1e9+7;

int main()
{
    ll n,m;
    cin >> n >> m;
    vector<ll> dv;
    for(ll i=1;i*i<=m;i++){
        if(m%i==0){
            if(i*i==m){
                dv.push_back(i);
            }
            else{
                dv.push_back(i);
                dv.push_back(m/i);
            }
        }
    }
    sort(dv.begin(),dv.end());
    ll s=dv.size();
    vector<vector<ll>> p(s);
    rep(i,s){
        for(ll j=0;dv[j]*dv[j]<=dv[i];j++){
            if(dv[i]%dv[j]==0){
                if(dv[j]*dv[j]==dv[i]){
                    auto it=lower_bound(dv.begin(),dv.end(),dv[j])-dv.begin();
                    p[i].push_back(it);
                }
                else{
                    auto it1=lower_bound(dv.begin(),dv.end(),dv[j])-dv.begin();
                    p[i].push_back(it1);
                    auto it2=lower_bound(dv.begin(),dv.end(),dv[i]/dv[j])-dv.begin();
                    p[i].push_back(it2);
                }
            }
        }
        sort(p[i].begin(),p[i].end());
    }
    /*vector<vector<ll>> dp(n+1,vector<ll>(s));
    dp[0][s-1]=1;
    rep(i,n){
        rep(j,s){
            for(auto x:p[j]){
                dp[i+1][x]+=dp[i][j];
                dp[i+1][x]%=mod;
            }
        }
    }
    cout << dp[n][0] << endl;*/
    return 0;
}