#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;
}