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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		List<Integer> b = getF(m);
		long mod = 1000000007;
		long ans = 1;
		for (Integer i : b) {
			//System.out.println(i);
			ans = (ans * Tohop(n + i - 1, n-1, mod)) % mod;
		}
		System.out.println(ans);

	}

	static long pow(long a, long b, long MOD) {
		long x = 1, y = a;
		while (b > 0) {
			if (b % 2 == 1) {
				x = (x * y);
				if (x > MOD)
					x %= MOD;
			}
			y = (y * y);
			if (y > MOD)
				y %= MOD;
			b /= 2;
		}
		return x;
	}

	static long InverseEuler(long n, long MOD) {
		return pow(n, MOD - 2, MOD);
	}

	static long Tohop(long n, long m, long MOD) {
		long f = 1;
		long f2 = 1;
		for (long i=m+1;i<=n;i++){
			f = (f*i)% MOD;
			f2 = (f2*(i-m)) % MOD;
		}
		return (f * InverseEuler(f2, MOD)) % MOD;
	}


	private static List<Integer> getF(int m) {
		List<Integer> b = new ArrayList<>();
		int i = 2;
		int c = 0;
		while (i <= m) {
			if (m % i == 0) {
				m /= i;
				c++;
			} else {
				if (c != 0)
					b.add(c);
				c = 0;
				i++;
			}
		}
		if (c != 0)
			b.add(c);
		if (m > 1)
			b.add(1);
		return b;
	}

}