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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.util.*;
class Main
{
    static long MOD = (long) Math.pow(10, 9) + 7;
    public static void main (String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[] p = fact(m);
        long ans = 1;
        for(int i = 0; i < p.length; i++){
            ans *= aHb(p[i], n);
            ans %= MOD;
        }
        System.out.println(ans);
    }
    static int[] fact (int M)
    {
        int[] res = new int[30];
        int index = 0;
        for(int i = 2; i <= M; i++){
            boolean flag = true;
            while(flag){
                if(M % i == 0){
                    res[index]++;
                    M /= i;
                }
                else{
                    flag = false;
                }
            }
            if(res[index] > 0) index++;
        }
        int[] ans = new int[index];
        for(int i = 0; i < index; i++) ans[i] = res[i];
        return ans;
    }
    static long aHb (long a, long b)
    {
        long x = a + b - 1;
        long y = b - 1;
        long MulSum = 1, DivSum = 1;
        for(int i = 1; i <= y; i++){
            MulSum *= x - i + 1;
            MulSum %= MOD;
            DivSum *= i;
            DivSum %= MOD;
        }
        return MulSum * pow(DivSum, MOD - 2) % MOD;
    }
   static long pow(long a, long b)
    {
        if(b == 0) return 1;
        if(b % 2 == 0){
            long d = pow(a, b / 2);
            return d * d % MOD;
        }
        else return  a *  pow(a, b - 1) % MOD;
    }
 }