using System;
using System.Collections.Generic;
using System.Linq;
using BitArray = System.Collections.BitArray;
using BigInteger = System.Numerics.BigInteger;

namespace AtCoderProject
{
    public class Program
    {
        public object Calc()
        {
            var line = consoleReader.SplitInt32();
            var N = line[0];
            var M = line[1];
            var factors = Factoring(M)
                .GroupBy(i => i)
                .ToDictionary(g => g.Key, g => g.Count());
            var ret = BigInteger.One;
            foreach (var f in factors)
            {
                // ||||○|○|○○|○ というイメージで並び替えて、|と○は区別しないと考えると
                // (count + N -1)! / (count! * (N-1)!) = Combination(count + N -1, N-1) = Combination(count + N -1, count)
                ret *= Combination(f.Value + N - 1, f.Value);
            }
            return ret % mod;
        }

        BigInteger Combination(int n, int k)
        {
            if (n / 2 < k) return Combination(n, n - k);

            BigInteger ret = 1;
            for (int i = 0; i < k; i++)
                ret *= n - i;
            for (int i = k; i > 1; i--)
                ret /= i;
            return ret;
        }
        IEnumerable<int> Factoring(int num)
        {
            int o = 0;
            int sqrt = (int)Math.Sqrt(num);
            int amari;
            foreach (var p in new[] { 2, 3, 5, 7 })
            {
                while (true)
                {
                    var d = Math.DivRem(num, p, out amari);
                    if (amari == 0)
                    {
                        yield return p;
                        num = d;
                    }
                    else if (num == 1) yield break;
                    else break;
                }
            }

            while (num > 1)
            {
                o += 10;
                if (sqrt < o) break;
                foreach (var p in new[] { o + 1, o + 3, o + 7, o + 9 })
                {
                    while (true)
                    {
                        var d = Math.DivRem(num, p, out amari);
                        if (amari == 0)
                        {
                            yield return p;
                            num = d;
                        }
                        else if (num == 1) yield break;
                        else break;
                    }
                }
            }
            yield return num;
        }

        public const int mod = 1000000007;
        #region いつもの
        private readonly ConsoleReader consoleReader;
        public Program() : this(new ConsoleReader()) { }
        public Program(ConsoleReader consoleReader) { this.consoleReader = consoleReader; }
        static void Main() => Console.WriteLine(new Program().Calc());
        public static string MultiLine<T>(IEnumerable<T> source) => string.Join("\n", source);
        #endregion
    }

    #region Console
    public class ConsoleReader { public virtual string String() => Console.ReadLine(); public int Int32() => int.Parse(String()); public long Int64() => long.Parse(String()); public ulong UInt64() => ulong.Parse(String()); public double Double() => double.Parse(String()); public string[] Split() => String().Split().ToArray(); public int[] SplitInt32() => String().Split().Select(int.Parse).ToArray(); public long[] SplitInt64() => String().Split().Select(long.Parse).ToArray(); public ulong[] SplitUInt64() => String().Split().Select(ulong.Parse).ToArray(); public double[] SplitDouble() => String().Split().Select(double.Parse).ToArray(); public IEnumerable<string> Repeat(int count) { for (int i = 0; i < count; i++) yield return String(); } public IEnumerable<int> RepeatInt32(int count) { for (int i = 0; i < count; i++) yield return Int32(); } public IEnumerable<long> RepeatInt64(int count) { for (int i = 0; i < count; i++) yield return Int64(); } public IEnumerable<string[]> RepeatSplit(int count) { for (int i = 0; i < count; i++) yield return Split(); } public IEnumerable<int[]> RepeatSplitInt32(int count) { for (int i = 0; i < count; i++) yield return SplitInt32(); } }
    #endregion
}

Measured memory_bytes: 13908