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

namespace ABC110
{
    class Program
    {
        static long mod = 1000000007;
        static Dictionary<long, int> Factorize(long M)
        {
            long Mcopy = M;
            Dictionary<long, int> res = new Dictionary<long, int>();
            for (int i = 2; i < Mcopy; i++)
            {
                while (M % i == 0)
                {
                    if (!res.ContainsKey(i))
                    {
                        res[i] = 1;
                    }
                    else
                    {
                        res[i]++;
                    }
                    M /= i;
                }
            }
            return res;
        }

        static long Modpow(long a, long n)
        {
            long res = 1;
            while (n > 0)
            {
                if ((n & 1) == 1)
                {
                    res = (res * a) % mod;
                }
                a = (a * a) % mod;
                n = n >> 1;
            }
            return res;
        }

        static long Modinv(long a)
        {
            return Modpow(a, mod - 2);
        }

        static long Combination(long a, long b)
        {
            long top = 1, bottom = 1;
            for (long i = 1; i <= b; i++)
            {
                top *= a - i + 1;
                bottom *= i;
                top = top % mod;
                bottom = bottom % mod;
            }
            return (top * Modinv(bottom)) % mod;
        }

        public static void Main(string[] args)
        {
            string[] s = Console.ReadLine().Split(' ');
            int N = int.Parse(s[0]);
            long M = long.Parse(s[1]);
            Dictionary<long, int> d = Factorize(M);
            long res = 1;
            foreach (long a in d.Keys)
            {
                res *= Combination(d[a] + N - 1, d[a]);
                res = res % mod;
            }
            Console.WriteLine(res);
        }
    }
}