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 cmb(int n, int r)
{
    if(r > n-r)
        r = n-r;
    ll val=1;
    ll a[r];
    int i, j;
    for(j=0; j<r; j++) {
        a[j] = (n--);
    }
    for(i=2; i<=r; i++) {
        for(j=0; j<r; j++) {
            if(a[j]%i==0) {
                a[j] /= i;
                break;
            }
        }
    }

    for(j=0; j<r; j++) {
        val *= a[j];
        val %= SENTINEL;
        //printf("a[%d] = %lld\n",j,a[j]);
    }
    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 = cmb(a[idx]+n-1, n-1);
        ans *= nCr;
        ans %= SENTINEL;
        //printf("%d-th factor cal succeeded: %lld\n",idx,nCr);
    }

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