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: Accepted)

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

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[] indexes = index(M);
        BigInteger ans = 1;
        if (M!=1)
        {
            for (int i = 0; i < indexes.Count(); i++)
            {
                ans *= nHk(indexes[i]+N-1, N-1);
            }
        }

/*
        for (int i = 0; i < indexes.Length; i++)
        {
            Console.WriteLine(indexes[i]);
        }
*/

        Console.WriteLine(ans%mod);
    }

    static int[] index(int n)
    {
        var list = new List<int>();
        if (n==1)
        {
            list.Add(1);
        }
        else
        {
            int i = 2;
            int temp = 0;
            while (n!=1)
            {
                 if (n%i==0)
                 {
                    temp++;
                    n /= i;
                 }
                 else
                 {
                    if (temp != 0)
                    {
                        list.Add(temp);
                    }
                    temp = 0;
                    i++;
                 }
            }
            list.Add(temp);
        }
        int[] res = list.ToArray();
        return res;
    }

    static BigInteger nHk(int n, int r)
    {
        if (n < 0 || r < 0 || r > n) throw new ArgumentException("不正な引数です．");

        if (n - r < r) r = n - r;
        if (r == 0) return 1;
        if (r == 1) return n;

        int[] numerator = new int[r];
        int[] denominator = new int[r];

        for (int k = 0; k < r; k++)
        {
            numerator[k] = n - r + k + 1;
            denominator[k] = k + 1;
        }

        for (int p = 2; p <= r; p++)
        {
            int pivot = denominator[p - 1];
            if (pivot > 1)
            {
                int offset = (n - r) % p;
                for (int k = p - 1; k < r; k += p)
                {
                    numerator[k - offset] /= pivot;
                    denominator[k] /= pivot;
                }
            }
        }
        BigInteger result = BigInteger.One;
        for (int k = 0; k < r; k++)
        {
            if (numerator[k] > 1) result *= numerator[k];
        }

        return result;
        /*
        long result;
        long temp1 = 1;
        for (int i = k; i < n+k; i++)
        {
            temp1 *= i;
            temp1 %= 
        }
        long temp2 = 1;
        for (int i = 1; i <= n ; i++)
        {
            temp2 *= i;
        }
        result = temp1 / temp2;
        Console.WriteLine(result);
        return result;
        */
    }
}