#P8561. 组合和

组合和

#include <stdio.h>
#include <stdlib.h>

#define ll long long
#define abs( F, A ) ({ F FF = A; FF > 0 ? FF : -FF; })
#define swap( F, A, B ) ({ F FF = A; A = B; B = FF; })
#define MAX 3000

ll fac[ 100 + 10 ], expo[ 100 + 10 ], top, S[ MAX + 10 ][ MAX + 10 ], P = 1998585857, n, m, i, tmp, k, Ans, fc, phi_n, j;

ll multi( ll F, ll FF, ll P ) {
	ll ans = 0; F %= P; FF %= P;
	for ( ; FF; FF >>= 1, F <<= 1, F %= P )
		if ( FF & 1 ) ans += F, ans %= P;
	return ans;
}

ll fpm( ll F, ll FF, ll P ) {
	ll ans = 1; F %= P;
	for ( ; FF; FF >>= 1, F = multi( F, F, P ) )
		if ( FF & 1 ) ans = multi( ans, F, P );
	return ans;
}

ll gcd( ll F, ll FF ) {
	if ( F < FF ) swap( ll, F, FF );
	while ( FF ) {
		ll t = FF; FF = F % FF; F = t;
	}
	return F;
}

#define TEST_TIME 20
int Miller_Rabin( ll k ) {
	if ( k == 2 ) return 1;
	int t = 0, q, i; ll k0 = k - 1;
	for ( ; ~k0 & 1; t++, k0 >>= 1 );
	for ( q = 1; q <= TEST_TIME; q++ ) {
		ll x[ 2 ] = { fpm( rand() % ( k - 2 ) + 1, k0, k ), 0 };
		for ( i = 1; i <= t; i++ ) {
			x[ i & 1 ] = multi( x[ i & 1 ^ 1 ], x[ i & 1 ^ 1 ], k );
			if ( x[ i & 1 ] == 1 )
				if ( x[ i & 1 ^ 1 ] != k - 1  &&  x[ i & 1 ^ 1 ] != 1 ) return 0;
				else { i++; break; }
		}
		if ( x[ i & 1 ^ 1 ] != 1 ) return 0;
	}
	return 1;
}

#define Trans( A, C, P ) ({ ll F = A; ( multi( F, F, P ) + C ) % P; })
void Pollard_rho( ll k ) {
	if ( Miller_Rabin( k ) ) { fac[ ++top ] = k; return; }
	ll x = 0, y = 0, c = rand() % k, i = 1, j = 1, p;
	for ( ; ; i++ ) { 
		x = Trans( x, c, k );
		p = gcd( abs( ll, x - y ), k );
		if ( p == k ) i = 0, j = 1, x = 0, y = 0, c = rand() % k;
		else if ( p != 1 ) { Pollard_rho( p ); Pollard_rho( k / p ); return; }
		if ( i == j )
			j <<= 1, y = x;
	}
}

void Factor( ll k ) {
	int LLCMP( const void *F, const void *FF ) {
		ll l1 = *(ll*)F, l2 = *(ll*)FF;
		if ( l1 < l2 ) return -1;
		else return l1 > l2;
	}
	Pollard_rho( k ); int i, j;
	qsort( fac + 1, top, sizeof( ll ), LLCMP );
	for ( i = 1, j = 0; i <= top; i++ )
		if ( i == 1  ||  fac[ i ] != fac[ i - 1 ] ) fac[ ++j ] = fac[ i ], expo[ j ] = 1;
		else expo[ j ]++;
	top = j;
}

void Stirling() {
	int i, j; S[ 0 ][ 0 ] = 1;
	for ( i = 1; i <= m; i++ )
		for ( j = 1; j <= i; j++ )
			S[ i ][ j ] = ( i - 1 ) * S[ i - 1 ][ j ] % P + S[ i - 1] [ j - 1 ], S[ i ][ j ] %= P;
}

int main() {

	scanf( "%lld%lld", &n, &m );

	if ( n == 1 ) {
		if ( m == 1 ) printf( "1\n" );
		else printf( "0\n" );
		return 0;
	}

	Factor( n );
	for ( i = 1, phi_n = 1; i <= top; i++ ) phi_n *= ( fac[ i ] - 1 ) * fpm( fac[ i ], expo[ i ] - 1, P );
	Stirling();

	for ( k = 1; k <= m; k++ ) {
		ll calc = 1;
		for ( i = 1; i <= top; i++ ) {
			ll d = 1, d0 = fpm( fac[ i ], k, P ), phi = fpm( fac[ i ], expo[ i ] - 1, P ) * ( fac[ i ] - 1 ), tmp = 0;
			for ( j = 0; j < expo[ i ]; j++ ) {
				tmp += d * ( phi % P ) % P; tmp %= P;
				d *= d0; d %= P; phi /= fac[ i ];
			}
			tmp += d; tmp %= P;
			calc *= tmp; calc %= P;
		}
		if ( ( m - k ) & 1 ) Ans = ( Ans - S[ m ][ k ] * calc % P + P ) % P;
		else Ans = ( Ans + S[ m ][ k ] * calc % P ) % P;
	}

	for ( i = 1, fc = 1; i <= m; i++ ) fc *= fpm( i, P - 2, P ), fc %= P;

	printf( "%lld\n", Ans * fc % P );

	return 0;
}