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.*;

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();
        int M = sc.nextInt();

        //Mの素因数分解

        int x = M;
        int[] mm = new int[50];
        Arrays.fill(mm, 0);

        int i = 2;
        int index  = 0;
        while( x > 1){
            if(x % i == 0){
                int count = 0;
                while(x % i == 0){
                    count++;
                    x /= i;
                }
                mm[index] = count;
            }
            else{
                if(mm[index] > 0) index++;
                i++;
            }
        }
        long ans = 1;

        int K = index + 1;

        for(int j = 0; j < K; j++){
            ans *= calComb(N + mm[j] - 1, Math.min(N-1, mm[j]));
            ans %= MOD;
        }
        System.out.println(calComb(5, 2));
    }

    public static long calComb (int n, int m){
        long sumMul = 1;
        long sumDiv1 = 1;
        long sumDiv2 = 1;
        long ans = 1;
        for(int i = 0; i < n; i++){
            sumMul *= i + 1;
            sumMul %= MOD;
        }
        for(int i = 0; i < m; i++){
            sumDiv1 *= (i+1);
            sumDiv1 %= MOD;
        }
        for(int i = 0; i < n - m; i++){
            sumDiv2 *= (i+1);
            sumDiv2 %= MOD;
        }

        ans *= sumMul;
        sumDiv1 = modPow(sumDiv1, MOD - 2);
        ans *= sumDiv1;
        ans %= MOD;
        sumDiv2 = modPow(sumDiv2, MOD - 2);
        ans *= sumDiv2;
        ans %= MOD;
        return ans;
    }
    public static long modPow(long n, long p){
        if(p == 0) return 1;
        else if( p % 2 == 0){
            long halfP = p / 2;
            return (long) ( Math.pow(modPow(n, halfP), 2) )% MOD;
        }
        else{
            return ( n * modPow(n, p - 1) )% MOD;
        }
    }
}