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: Wrong Answer)

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

namespace ABC110_D
{
    class Program
    {
        static long mod = (long)Math.Pow(10, 9) + 7;

        static void Main(string[] args)
        {
            var NM = Console.ReadLine().Split().Select(long.Parse).ToArray();
            var N = NM[0];
            var M = NM[1];

            long a = 1;
            var pl = CalcPrimeFactors(M);
            while (pl.Count > 0)
            {
                long c = pl.Where(x => x == pl[0]).Count();

                pl = pl.Where(x => x != pl[0]).ToList();
                a *= CalcComb(c + N - 1, c);
            }
            Console.WriteLine(a % mod);
        }
        public static long CalcComb(long n, long r)
        {
            long ans = 1;
            for (var i = n - r + 1; i <= n; i++)
            {
                ans = ans * i % mod;
            }
            for (var i = 2; i <= r; i++)
            {
                ans = ans * CalcModPow(i, mod - 2) % mod;
            }
            return ans;
        }

        public static long CalcModPow(long x, long n)
        {
            long ans = 1;
            for (; n > 0; n /= 2)
            {
                if (n % 2 == 1)
                {
                    ans = ans * x % mod;
                    n -= 1;
                }
                x = x * x % mod;
            }
            return ans;
        }

        public static List<long> CalcPrimeFactors(long n)
        {
            var factors = new List<long>();
            while (n % 2 == 0)
            {
                n /= 2;
                factors.Add(2);
            }
            for (long i = 3; i * i <= n; i += 2)
            {
                while (n % i == 0)
                {
                    n /= i;
                    factors.Add(i);
                }
            }
            if (n != 1) factors.Add(n);
            return factors;
        }
    }
}