unittest
{
	assert( [ "2 6" ].parse.expand.solve == 4 );
	assert( [ "3 12" ].parse.expand.solve == 18 );
	assert( [ "100000 1000000000" ].parse.expand.solve == 957870001 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nm = input.front.split.to!( long[] );
	return tuple( nm[ 0 ], nm[ 1 ] );
}

auto solve( long n, long m )
{
	const MOD = 10L ^^ 9 + 7;
	
	// mを素因数分解して同じ素因数ごとに個数を数える
	auto fs = primefactorize( m ).group;
	
	// 同じ素因数をn個の箱に割り振ったときの組み合わせを計算
	auto ans = 1L;
	foreach( f; fs )
	{
		ans = ans.mulMod!MOD( ( f[ 1 ] + n - 1 ).combinationMod!MOD( n - 1 ) );
	}
	return ans;
}

// 掛け算
auto mulMod( long MOD )( long x, long y )
{
	return x * y % MOD;
}

// 割り算
auto divMod( long MOD )( long x, long y )
{
	return x * y.powMod!MOD( MOD - 2 ) % MOD;
}

// べき乗
auto powMod( long MOD )( long x, long y )
{
	auto a = 1L;
	for( ; 0 < y; y >>= 1 )
	{
		if( y & 1 ) a = a * x % MOD;
		x = x ^^ 2 % MOD;
	}
	return a;
}

// 階乗
auto factorialMod( long MOD )( long x )
{
	static memo = [ 1L ];
	if( memo.length <= x )
	{
		auto i = memo.length;
		memo.length = x + 1;
		for( ; i <= x; i++ ) memo[ i ] = memo[ i - 1 ] * i % MOD;
	}
	return memo[ x ];
}

// 組み合わせ数
auto combinationMod( long MOD )( long x, long y )
{
	return x.factorialMod!MOD.divMod!MOD( y.factorialMod!MOD.mulMod!MOD( ( x - y ).factorialMod!MOD ) );
}

// 順列数
auto permutationMod( long MOD )( long x, long y )
{
	return x.factorialMod!MOD.divMod!MOD( ( x - y ).factorialMod!MOD );
}

// 素数列
auto primes( long x )
{
	long[] ps;
	if( x < 2 ) return ps;
	
	auto cs = new bool[]( x + 1 );
	ps = [ 2L ];
	for( auto i = 3L; i * i < cs.length; i += 2 )
	{
		if( cs[ i ] ) continue;
		for( auto j = i; i * j < cs.length; j++ )
		{
			cs[ i * j ] = true;
		}
	}
	for( auto i = 3L; i < cs.length; i += 2 )
	{
		if( !cs[ i ] ) ps ~= i;
	}
	return ps;
}

// 素因数分解
auto primefactorize( long x )
{
	long[] fs;
	if( x < 2 ) return fs;
	
	auto s = ( cast( long ) x ^^ 0.5 ) + 1;
	foreach( p; s.primes )
	{
		while( x % p == 0 )
		{
			x /= p;
			fs ~= p;
		}
		if( x < 2 ) break;
	}
	if( 2 <= x ) fs ~= x;
	return fs;
}
