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: Runtime Error)

using System;
using System.Linq;
using System.Collections.Generic;

class program
{
    static long mod = 1000000007;
    static void Main(string[] args)
    {
        int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int N = input[0];
        int M = input[1];
        int[] factors = facterize(M);
        var index = new List<int>();
        long ans = 1;
        if (M != 1)
        {
            int counter = 0;
            int n = factors[0];
            for (int i = 0; i < factors.Length; i++)
            {

                if (n == factors[i])
                {
                    counter++;
                }
                else
                {
                    index.Add(counter);
                    counter = 1;
                    n = factors[i];
                }
                index.Add(counter);
            }
            for (int i = 0; i < index.Count(); i++)
            {
                ans = ans * nHk(N, index[i]);
            }
            Console.WriteLine(ans%mod);
        }
    }

    static int[] facterize(long n)
    {
        var factors = new List<int>();
        if (n==1)
        {
            factors.Add(1);
        }
        else
        {
            int i = 2;
            while (i*i<=n)
            {
                 if (n%i==0)
                 {
                    factors.Add(i);
                    n /= i;
                }
                else
                {
                    i++;
                }

            }
        }
        int[] result = factors.ToArray();
        return result;
    }

    static int nHk(int n, int k)
    {
        int result;
        result = kaijou(n + k - 1) / (kaijou(n) * kaijou(k - 1));
        return result;
    }

    static int kaijou(int n)
    {
        int result = 1;
        for (int i = 1; i <= n; i++)
        {
            result = result * i;
        }
        return result;
    }

}