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 Java (OpenJDK 11.0.6) (judge verdict: Wrong Answer)

import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		final int mod = 1000000007;
		Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
		long m = sc.nextLong();
		HashMap<Long, Integer> map = new HashMap<>();
		if(m <= 1)
			System.out.println(m); //1以下の場合
		for(long i = 2 ; i <= (Math.sqrt(m)) + 1 ; i++) {
			if(m % i != 0)
				continue;
			m /= i;
			map.put(i, map.getOrDefault(i,  0) + 1);
			if(m == 1)
				break;
          i--;
		}
		if(m != 1)
			map.put(m, map.getOrDefault(m,  0) + 1);
		long ans = 1;
		for(Long l : map.keySet()) {
			ans *= nCk(map.get(l) + n - 1, map.get(l).intValue() , mod);
			ans += mod;
			ans %= mod;
		}
		System.out.println(ans);



	}
	public static int nCk(int n,int k,int M) {
        long ret = 1;
        int min = Math.min(k, n-k);
        for(int i=1;i<=min;i++) {
            ret = (ret * pow(i,M-2,M)) % M;
        }
        for(int i=n-min+1;i<=n;i++) {
            ret = (ret * i) % M;
        }
        return (int)ret;
    }
	 public static long pow(long a,long b,int M) {
	        long ret = 1;
	        long tmp = a;
	        while(b>0) {
	            if((b&1)==1) ret = (ret * tmp) % M;  //2進数によるべき乗の高速計算
	            tmp = (tmp * tmp) % M;
	            b = b>>1;
	        }
	        return ret;
	    }


}