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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
#define SENTINEL 1000000007
typedef long long ll;

ll fact(int n)
{
    //printf("fact(%d) called\n",n);
    if(n==1)
        return 1;
    else
        return (n * fact(n-1));
}

ll conv(int n, int r)
{
    return fact(n) / (fact(r) * fact(n-r));
}

ll conv2(int n, int r)
{
    if(r > n-r)
        r = n-r;
    int i;
    ll val=1;
    for(i=1; i<=r; i++,n--) {
        val = val * n / i;
        //val %= SENTINEL;
        //printf("val=%lld\n",val);
    }
    return val;
}

int main()
{
    int n, m;
    int a[100000]={0};
    int idx=0;
    ll ans=1;
    int i, j;

    scanf("%d %d", &n, &m);
    for(i=2; m>1; i++) {
        while(m%i==0) {
            m /= i;
            a[idx]++;
        }
        if(a[idx]!=0) {
            idx++;
        }
    }
    //puts("Factorization Succeeded");
    for(idx=0; a[idx]!=0; idx++) {
        ll nCr = conv2(a[idx]+n-1, n-1);
        nCr %= SENTINEL;
        ans *= nCr;
        ans %= SENTINEL;
        //printf("%d-th factor cal succeeded: %lld\n",idx,nCr);
    }

    printf("%lld",ans);
    return 0;
}