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.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace kp
{
    public class Program
    {
        //static long[,] cmb;
        static int MAX_INT = 1000000007;
        static void Main(string[] args)
        {
            //long N = long.Parse(Console.ReadLine());
            int[] input = Console.ReadLine().Split().Select(p => int.Parse(p)).ToArray();
            int N = input[0];
            int M = input[1];

            // Mを素因数分解する
            Dictionary<int, int> factor = new Dictionary<int, int>();
            int sum = 1;
            factor.Add(1, 0);
            for (int i = 2; i <= M / 2 + 1;i++ )
            {
                while(M%i == 0)
                {
                    if(factor.ContainsKey(i))
                    {
                        factor[i] += 1;
                        sum++;
                    }
                    else
                    {
                        factor.Add(i, 1);
                        sum++;
                    }
                    M /= i;
                }

                if (M == 1)
                    break;
            }
            if (M > 1)
            {
                factor.Add(M, 1);
                sum++;

            }
            long[,] cmb = new long[sum+N, sum+1];
            // iCjの表を作る
            cmb[0,0] = 1; cmb[1,0] = 1; cmb[1,1] = 1;
            for (int i = 2; i <= sum+N-1; i++ )
            {
                for(int j=0; j<=i && j<=sum; j++)
                {
                    if(j>0)
                    {
                        long a = (cmb[i - 1, j - 1] + cmb[i - 1, j]) % MAX_INT;
                            
                        cmb[i, j] = a;
                    }
                    else
                    {
                        long a = (cmb[i - 1, j]) % MAX_INT;
                        cmb[i, j] = a;
                    }
                }
            }

            long ret = 1;
            // N-1個の仕切りと、f^?の?個の並び替えを掛け合わせる
            foreach(var f in factor.Keys)
            {
                int num = factor[f];
                // sumCnumを掛けていく
                long a = cmb[(num + N - 1), num];
                ret = (ret*a)%MAX_INT;
            }

            Console.WriteLine(ret + "");
        }
    }
}