unittest
{
	assert( [ "3 24" ].parse.expand.solve == 2 );
	assert( [ "5 1" ].parse.expand.solve == 1 );
	assert( [ "1 111" ].parse.expand.solve == 111 );
	assert( [ "4 972439611840" ].parse.expand.solve == 206 );
	
	assert( [ "972438571129 972438571129" ].parse.expand.solve == 1 );		// 追加ケース
}



import std.conv;
import std.functional;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

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

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

auto solve( long n, long p )
{
	if( n == 1 ) return p;
	if( p / n < 2 ) return 1;		// nが大きすぎるとpowpow()が死ぬのでチェックしておく
	
	auto ans = 1L;
	
	for( auto i = 1; i <= p; i++ )
	{
		auto t = powpow( i, n );
		if( p < t ) break;
		if( p % t == 0 ) ans = i;
	}
	
	return ans;
}

long powpow( long a, long b )
{
	switch( b )
	{
		case 0 : return 1;
		case 1 : return a;
		default: return memoize!powpow( a, b / 2 ) * memoize!powpow( a, b / 2 + b % 2 );
	}
}
