use std::collections::HashMap; const MOD: usize = 1e9 as usize + 7; fn main() { let mut nm = String::new(); std::io::stdin().read_line(&mut nm).ok(); let nm: Vec = nm.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = nm[0]; let m = nm[1]; let mut factors = HashMap::new(); let mut target = m; for i in 2..=(m as f64).sqrt().floor() as usize { while target % i == 0 { *factors.entry(i).or_insert(0usize) += 1; target /= i; } } if target > 1 { factors.insert(target, 1); } let mut result = 1usize; for &limit in factors.values() { let mut dp = vec![vec![0usize; limit+1]; n+1]; dp[0][0] = 1; for i in 0..n { for j in 0..=limit { if dp[i][j] == 0 { continue; } dp[i+1][0] += dp[i][j]; dp[i+1][0] %= MOD; if j > 0 { dp[i+1][limit+1-j] += MOD - dp[i][j]; dp[i+1][limit+1-j] %= MOD; } } for j in 0..limit { dp[i+1][j+1] += dp[i+1][j]; dp[i+1][j+1] %= MOD; } } result *= dp[n].iter().sum::() % MOD; result %= MOD; } println!("{}", result); }