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: Wrong Answer)

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<utility>
#include<map>
#include<set>
#include<queue>
#include<math.h>
using namespace std;
#define N (1000000000+7)
#define INF 1e16
typedef pair<int,int> P;
typedef long long ll;
ll kaijo[200000];

void init() {
	kaijo[0] = 1;
	for (ll i = 1;i < 200000;i++)kaijo[i] = (kaijo[i - 1] * i) % N;
}

ll inv(ll x) {
	ll res = 1;
	ll k = N - 2;
	ll y = x;
	while (k) {
		if (k & 1)res = (res*y) % N;
		y = (y%N*y%N) % N;
		k /= 2;
	}
	return res;
}

ll Comb(ll n, ll k) {
	if (n < 0 || k < 0 || (n - k) < 0)return 0;
	ll b = kaijo[n];
	ll c = kaijo[n - k];
	ll d = kaijo[k];
	ll cd = (c*d) % N;
	return ((b%N)*(inv(cd)) % N) % N;
}


int main(void){
    ll n,m;
    cin>>n>>m;
    if(n==1){
        cout<<1<<endl;
        return 0;
    }
    if(m==1){
        cout<<1<<endl;
        return 0;
    }
    vector<ll>primenumber;
    ll y=(ll)sqrt(m)+1;
    for(ll i=2;i<=y;i++){
        if(m%i==0){
            ll num=0;
            while(m%i==0){
                num++;
                m=m/i;
            }
            primenumber.push_back(num);
        }
    }
    if((ll)primenumber.size()==0)primenumber.push_back(1);
    ll ans=1;
    init();
    for(auto itr=primenumber.begin();itr!=primenumber.end();++itr){
        ll x=*itr;
        ans=(ans*Comb(x+n-1,n-1))%N;
    }
    cout<<(ans+N)%N<<endl;
    return 0;
}