unittest
{
	assert( [ "12 18" ].parse.expand.solve == 3 );
	assert( [ "420 660" ].parse.expand.solve == 4 );
	assert( [ "1 2019" ].parse.expand.solve == 1 );
}



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 ab = input.front.split.to!( long[] );
	return tuple( ab[ 0 ], ab[ 1 ] );
}

auto solve( long a, long b )
{
	// 公約数を列挙
	auto ds = divisors( a, b ).sort();
	
	// 素数判定用素数列を生成
	auto ps = ( 1L ~ ds[ $ - 1 ].primes ).assumeSorted;
	
	// 公約数のうち、素数のものを選択
	auto ans = 0L;
	foreach( d; ds )
	{
		ans += ( !ps.find( d ).empty );
	}
	return ans;
}

// 公約数列挙
auto divisors( long[] ns ... )
{
	bool[ long ] ds;
	auto m = ns.reduce!min;
	LOOP: for( auto i = 1L; i <= m; i++ )
	{
		foreach( n; ns )
		{
			if( n % i != 0 ) continue LOOP;
		}
		ds[ i ] = true;
	}
	return ds.keys;
}

// 素数列
auto primes( long x )
{
	Appender!( long[] ) ps;
	if( x < 2 ) return ps.data;
	
	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.data;
}
