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.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(index[i], N);
            }
        }
        Console.WriteLine(ans%mod);
    }

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

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

    static long nHk(int n, int k)
    {
        long result;
        long temp1 = 1;
        for (int i = k; i < n+k; i++)
        {
            temp1 *= i;
        }
        long temp2 = 1;
        for (int i = 1; i <= n ; i++)
        {
            temp2 *= i;
        }
        result = temp1 / temp2;
        return result;
    }

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

}