#include int main() { char N[1048576]; char M[1048576]; uint64_t p = 129402307; scanf("%s", N); scanf("%s", M); int N_size = strlen(N); int M_size = strlen(M); uint64_t n = 0; uint64_t m = 0; if( N_size == 1 and N[0] == '0' ) { printf("0\n"); return 0; } if( M_size == 1 and M[0] == '0' ) { printf("1\n"); return 0; } for(int i = 0; i < N_size; ++i) { n = (n * 10 + (N[i] - '0')) % p; } for(int i = 0; i < M_size; ++i) { m = (m * 10 + (M[i] - '0')) % (p - 1); } if( n == 0 ) { printf("0\n"); return 0; } uint64_t ans = 1; while( m != 0 ) { if( (m & 0x01) != 0 ) { ans = (ans * n) % p; } n = (n * n) % p; m >>= 1; } printf("%ld\n", ans); return 0; }