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# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Numerics;
class Program
{
	static void Main(string[] args)
	{
		// スペース区切りの整数の入力
		string[] input = Console.ReadLine().Split(' ');
		long N = int.Parse(input[0]);
		long M = int.Parse(input[1]);
        long LARGE = (long)Math.Pow(10, 9)+7;
        long res = 1;
        if (N==1){
            //出力
		    Console.WriteLine(res);
        } else {
            long L6 = (long)Math.Pow(10, 6);
            long L5 = (long)Math.Pow(10, 5);
            long[] NCRS = new long[L6];
            NCRS[0] = 1;
            for (int i=1; i<L6; i++){
                NCRS[i] = (NCRS[i-1]*(N-1+i)%LARGE)*ModPow(i, LARGE-2, LARGE)%LARGE;
            }

            for (int p=2; p<L5; p++){
                int q = 0;
                while (M % p == 0){
                    M = M / p;
                    q++;
                }
                if (q > 0){
                    res = res * NCRS[q] % LARGE;
                }
            }
            if (M > 1){
                res = res * NCRS[1] % LARGE;
            }

            //出力
            Console.WriteLine(res);
        }

	}
    // modular inverse
    public static long ModPow(long a, long b, long d) {
        long r = 1;
        long c = 0;
        while (b > c){
            if (c == 0){
                r = a;
                c++;
            } else if (b >= c*2){
                r = r*r%d;
                c = c*2;
            } else {
                r = r*ModPow(a, b-c, d)%d;
                c = b;
            }
        }
        return r;
    }
}