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: Time Limit Exceeded)

#include <bits/stdc++.h>
using namespace std;
#define _GLIBCXX_DEBUG
#define all(v) v.begin(), v.end()
using in = int64_t;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
const double PI=3.14159265358979323846;
const in MOD = 1000000007;
const in INF=1<<30;
#define vec2(a,y,x) vector<vector<int>> a(y,vector<int>(x))
#define vec1(a,n) vector<int> a(n);rep(i,n)cin>>a[i]
using P=pair<int,int>;

in n;

void waru(in &rr,in &x){
while(rr>1ll){
if(x%rr==0ll){ x/=rr;rr --;} 
}
  return;
}

in ncr(in nn,in r){
  if(nn-r<r) r=nn-r;
  in ret=1ll;
  in rr=r;
 rep(i,r){
   ret*=nn;
   nn--;
   waru(rr,ret);
   /*if(rr==1ll)*/ret %=MOD;
         }
  return ret;
}

in nhr(in r){return ncr(n+r-1ll,r);}

int main(){
  int m;
  cin>>n>>m;
  vector<int> soi(0);
  int x=2;
  while(m>1){
    if(m%x==0){ m/=x; soi.push_back(x);}
    else x ++;
  }
  sort(all(soi));
  auto y=soi.begin();
  vector<int> sp(0);
  while(y<soi.end()){
    sp.push_back(upper_bound(all(soi),*y)-lower_bound(all(soi),*y));
    y=upper_bound(all(soi),*y);
  }
  in ans=1ll;
  rep(i,sp.size()){
  	ans *=nhr((in)(sp[i]));
    ans%=MOD;
  }
  cout<<ans<<endl;
}