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: Wrong Answer)

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        long N = sc.nextLong();
        long M = sc.nextLong();
        long mod = 1000000007;
        long ans = 1;
        final int m = (int)Math.sqrt(M);
        boolean[] prm = new boolean[m+1];
        for(int i = 2;i < m+1;i++)  prm[i] = true;
        for(int i = 2;i < m+1;i++){
            if(prm[i]){
                for(int j = i*2;j < m+1;j += i) prm[j] = false;
            }
        }
        int[] L1 = new int[m+1];
        int id = 0;
        for(int i = 2;i < m+1;i++){
            if(prm[i]){
                while(M%i == 0){
                    L1[id]++;
                    M /= i;
                }
                id++;
            }
        }
        if(M != 1){
            L1[id]++;
            id++;
        }
        for(int i = 0;i < id;i++){
            ans *= comb(L1[i]+N-1, L1[i], mod);
            ans %= mod;
        }
        System.out.println(ans);
    }
    public static long comb(long n, long m, long r){
        final int mm = (int)m;
        if(mm == 0) return 1;
        long[] A = new long[mm];
        long[] B = new long[mm];
        for(int i = 0;i < mm;i++){
            A[i] = n-i;
            B[i] = mm-i;
        }
        for(int i = 0;i < mm;i++){
            for(int j = 0;j < mm;j++){
                if(A[j]%B[i] == 0){
                    A[j] /= B[i];
                    break;
                }
            }
        }
        long ans = 1;
        for(int i = 0;i < mm;i++){
            ans *= A[i];
            ans %= r;
        }
        return ans;
    }
}