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 <limits.h>
using namespace std;

int main(void){
    
    int n, m;
    cin >> n >> m;
    
    
    long long prod, primes = 2, powers = 1, prime_p[100], prime_q[100];
    prod = m;
    
    
    for (int prfc_i = 1; prfc_i <= 100; prfc_i++) {
        prime_p[prfc_i] = prime_q[prfc_i] = 0;
    }
    
    while (prod >= primes) {
        while (prod % primes == 0) {
            if (prime_q[powers] > 0) prime_q[powers]++;
            else {
                prime_p[powers] = primes;
                prime_q[powers]++;
            }
            prod /= primes;
            if (prod % primes != 0) powers++;
        }
        primes++;
    }
    powers--;
    
//    for (int prfc_i = 1; prfc_i <= powers; prfc_i++) {
//        cout << prime_p[prfc_i] << " " << prime_q[prfc_i] << endl;
//    }
    
    
    long long cb_l, cb_r, comb = 1, ans = 1;
    for (int i = 1; i <= powers; i++) {
        cb_l = n + prime_q[i] - 1;
        cb_r = prime_q[i];
        if (cb_l < cb_r || cb_l < 0 || cb_r < 0) comb = 0;
        else {
	        for (long cb_i = 1; cb_i <= cb_r; cb_i++) {
		        comb *= (cb_l - cb_i + 1);
		        comb /= cb_i;
		        if (comb > 1000000007) comb %= 1000000007;
	        }
        }
        ans *= comb;
        if (ans > 1000000007) ans %= 1000000007;
        comb = 1;
    }
    
    cout << ans;
    
}