#include <iostream>
#include <cstdio>
//#include <string.h>
#include <vector>
//#include <ctime>
#define SumOfDigits(x, y, z) x + y + z - 3 * '0'
#define ProductOfDigits(x, y) (x[0] - '0') * (y[0] - '0')
#define Product2Digits(x, y) (x - '0') * (y - '0')
//#define ProductDigits(x, y) (x - '0') * (y - '0')
using namespace std;
vector<int> deleteFrontZeros(vector<int> numberArray){
while(numberArray[0] == 0 && numberArray.size() > 1){
numberArray.erase(numberArray.begin());
}
return numberArray;
}
vector<int> addFrontZeros(vector<int> numberArray, int numberOfZeros){
for(int i = 0; i < numberOfZeros; i++){
numberArray.insert(numberArray.begin(), 0);
}
return numberArray;
}
string vector2string(vector<int> numberArray){
string number="";
for(int i = 0; i < numberArray.size(); i++){
number += (numberArray[i] + '0');
}
return number;
}
vector<int> string2Vector(string number){
vector<int> numberArray={};
for(int i = 0; i < number.size(); i++){
numberArray.push_back(number[i] - '0');
}
return numberArray;
}
vector<int> number2Array(int number){
vector<int> numberArray;
numberArray.clear();
if(number == 0)
return {0};
while(number > 0){
numberArray.insert(numberArray.begin(), number % 10);
number /= 10;
}
return numberArray;
}
int equalizeLength(vector<int> &x, vector<int> &y){
int difference = x.size() - y.size();
if(difference > 0){
y = addFrontZeros(y, difference);
}
else{
x = addFrontZeros(x, -difference);
}
return x.size();
}
vector<int> add2Numbers(vector<int> result, int number, int displacement){
int sum;
for(int i = result.size() - 1 - displacement; i >= 0; ){
sum = result[i] + number % 10;
result[i] = sum % 10;
result[i - 1] += (sum / 10);
number /= 10;
if(number == 0){
i = -1;
}
else{
i--;
}
}
return result;
}
vector<int> addBackSideZeros(vector<int> numberArray, int numberOfZeros){
for(int i = 0; i < numberOfZeros; i++){
numberArray.push_back(0);
}
return numberArray;
}
void addFrontZeros(string &x, int numberOfZeros){
for(int i = 0; i < numberOfZeros; i++){
x = '0' + x;
}
}
void addBackSideZeros(string &x, int numberOfZeros){
for(int i = 0; i < numberOfZeros; i++){
x = x + '0';
}
}
void deleteFrontZeros(string &x){
while(x[0] == '0'){
x.erase(0, 1);
}
}
int equalizeLength(string &x, string &y){
int difference = x.size() - y.size();
if(difference > 0){
addFrontZeros(y, difference);
}
else{
addFrontZeros(x, -difference);
}
return x.size();
}
string add2Numbers(string x, string y){
string result = "0";
int length = equalizeLength(x, y);
int sum;
addFrontZeros(result, length);
for(int i = length - 1; i >= 0; i--){
sum = SumOfDigits(x[i], y[i], result[i + 1]);
result[i + 1] = '0' + sum % 10;
result[i] = '0' + sum / 10;
}
deleteFrontZeros(result);
return result;
}
string add3Numbers(string x, string y, string z){
return add2Numbers(add2Numbers(x, y), z);
}
// we know that x is bigger than y
string subtract2Numbers(string x, string y){
string result = "0";
int length = equalizeLength(x, y);
int sum;
addFrontZeros(result, length);
for(int i = length - 1; i >= 0; i--){
sum = x[i] - y[i];
if(sum < 0){
x[i - 1] -= 1;
sum += 10;
}
result[i + 1] += sum;
}
deleteFrontZeros(result);
return result;
}
string product2Digits(string x, string y){
string result = "";
int sum;
sum = ProductOfDigits(x, y);
if(sum >= 10){
result += ('0' + sum / 10);
}
result += ('0' + sum % 10);
return result;
}
string product2Numbers(string x, string y){
int length, fh, sh, sum, difference;
string result, x1, x2, y1, y2, a, d, e;
if(x == "0" || y == "0") return "0";
difference = x.size() - y.size();
if(difference > 0){
for(int i = difference; i--;)
y = '0' + y;
}
else{
for(int i = -difference; i--;)
x = '0' + x;
}
length = x.size();
if(length == 0) return "0";
if(length == 1){
result="";
sum = (x[0] - '0') * (y[0] - '0');
if(sum >= 10){
result += ('0' + sum / 10);
}
result += ('0' + sum % 10);
return result;
}
sh = length / 2;
fh = length - sh;
x1 = x.substr(0, fh);
x2 = x.substr(fh, sh);
y1 = y.substr(0, fh);
y2 = y.substr(fh, sh);
a = product2Numbers(x1, y1);
d = product2Numbers(x2, y2);
e = product2Numbers(add2Numbers(x1, x2), add2Numbers(y1, y2));
e = subtract2Numbers(e, add2Numbers(a, d));
addBackSideZeros(a, length - length % 2);
addBackSideZeros(e, length / 2);
return add3Numbers(d, a, e);
}
string product2NumbersGreedy(string x, string y){
vector<int> result = {0}, X, Y;
int displacement;
X = string2Vector(x);
Y = string2Vector(y);
result = addFrontZeros(result, x.size() + y.size());
for(int i = x.size() - 1; i >= 0; i--){
displacement = x.size() - i - 1;
for(int j = y.size() - 1; j >= 0; j--){
result = add2Numbers(result, X[i] * Y[j], displacement);
displacement++;
}
}
result = deleteFrontZeros(result);
return vector2string(result);
}
string decToBin(int n){
string x = "";
while(n > 0){
if(n % 2 == 1){
x = '1' + x;
}
else{
x = '0' + x;
}
n /= 2;
}
return x;
}
string exponentiation(string number, int exponent){
string exponentBINARY, solution="1";
exponentBINARY = decToBin(exponent);
if(number == "0"){
return "0";
}
for(int i = exponentBINARY.size() - 1; i >= 0; i--){
if(exponentBINARY[i] == '1'){
solution = product2NumbersGreedy(solution, number);
}
if(i != 0){
number = product2NumbersGreedy(number, number);
}
}
deleteFrontZeros(solution);
return solution;
}
int main(){
ios::sync_with_stdio(false);
string x, z;
int y;
cin >> x >> y;
//clock_t beginning = clock();
z = exponentiation(x, y);
//clock_t ending = clock();
cout << z << endl;
//cout << (ending - beginning);
}