#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#define SumOfDigits(x, y, z) x + y + z - 3 * '0'
using namespace std;
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;
}
vector<bool> decToBin(int n){
vector<bool> binNumber;
binNumber.clear();
while(n > 0){
if(n % 2 == 1){
binNumber.insert(binNumber.begin(), true);
}
else{
binNumber.insert(binNumber.begin(), false);
}
n /= 2;
}
return binNumber;
}
vector<int> addFrontZeros(vector<int> numberArray, int numberOfZeros){
for(int i = 0; i < numberOfZeros; i++){
numberArray.insert(numberArray.begin(), 0);
}
return numberArray;
}
vector<int> addBackSideZeros(vector<int> numberArray, int numberOfZeros){
for(int i = 0; i < numberOfZeros; i++){
numberArray.push_back(0);
}
return numberArray;
}
vector<int> deleteFrontZeros(vector<int> numberArray){
while(numberArray[0] == 0 && numberArray.size() > 1){
numberArray.erase(numberArray.begin());
}
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> x, vector<int> y){
vector<int> result;
int length = equalizeLength(x, y);
int sum;
result.clear();
result = addFrontZeros(result, length + 1);
for(int i = length - 1; i >= 0; i--){
sum = x[i] + y[i] + result[i + 1];
result[i + 1] = sum % 10;
result[i] = sum / 10;
}
result = deleteFrontZeros(result);
return result;
}
vector<int> add3Numbers(vector<int> x, vector<int> y, vector<int> z){
return add2Numbers(add2Numbers(x, y), z);
}
// we know that x is bigger than y
vector <int> subtract2Numbers(vector <int> x, vector<int> y){
vector<int> result;
int length = equalizeLength(x, y), sum;
result.clear();
result = 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] = sum;
}
result = deleteFrontZeros(result);
return result;
}
vector<int> product2Numbers(vector<int> x, vector<int> y){
int length, fh, sh;
vector<int> a, d, e;
vector<int>::iterator firstX1, firstX2, lastX1, lastX2, firstY1, firstY2, lastY1, lastY2;
if((x[0] == 0 && x.size() == 1)|| (y[0] == 0 && y.size() == 1)) return {0};
length = equalizeLength(x, y);
if(length == 0) return {0};
if(length == 1){
return number2Array(x[0] * y[0]);
}
sh = length / 2;
fh = length - sh;
firstX1 = x.begin();
lastX1 = x.begin() + fh;
firstX2 = x.begin() + fh;
lastX2 = x.begin() + fh + sh;
firstY1 = y.begin();
lastY1 = y.begin() + fh;
firstY2 = y.begin() + fh;
lastY2 = y.begin() + fh + sh;
vector<int> x1(firstX1, lastX1), x2(firstX2, lastX2), y1(firstY1, lastY1), y2(firstY2, lastY2);
/*for(int i = 0;i < x1.size(); i++)
cout << x1[i];
cout << ' ';
for(int i = 0;i < x2.size(); i++)
cout << x2[i];
cout << ' ';
for(int i = 0;i < y1.size(); i++)
cout << y1[i];
cout << ' ';
for(int i = 0;i < y2.size(); i++)
cout << y2[i];
cout << endl;
cout << x1.size() << ' ' << x2.size() << ' ' << y1.size() << ' ' << y2.size() << endl;
*/
a = product2Numbers(x1, y1);
d = product2Numbers(x2, y2);
e = product2Numbers(add2Numbers(x1, x2), add2Numbers(y1, y2));
e = subtract2Numbers(e, add2Numbers(a, d));
a = addBackSideZeros(a, length - length % 2);
/*for(int i = 0;i < a.size(); i++)
cout << a[i];
cout << endl;*/
e = addBackSideZeros(e, length / 2);
/*for(int i = 0;i < e.size(); i++)
cout << e[i];
cout << endl;*/
return add3Numbers(d, a, e);
}
vector<int> product2NumbersGreedy(vector<int> x, vector<int> y){
vector<int> result, help;
int zerosToAppend, sum;
for(int i = x.size() - 1; i >= 0; i--){
zerosToAppend = x.size() - i - 1;
for(int j = y.size() - 1; j >= 0; j--){
help = number2Array(x[i] * y[j]);
help = addBackSideZeros(help, zerosToAppend);
result = add2Numbers(result, help);
zerosToAppend++;
}
}
return result;
}
string exponentiation(int number, int exponent){
vector<bool> exponentBinary;
vector<int> solution = {1}, numberArray;
string finish="";
exponentBinary.clear();
exponentBinary = decToBin(exponent);
numberArray = number2Array(number);
if(number == 0){
return "0";
}
for(int i = exponentBinary.size() - 1; i >= 0; i--){
if(exponentBinary[i] == true){
solution = product2NumbersGreedy(solution, numberArray);
}
if(i != 0){
numberArray = product2NumbersGreedy(numberArray, numberArray);
}
}
solution = deleteFrontZeros(solution);
for(int i = 0; i < solution.size(); i++)
finish += (solution[i] + '0');
return finish;
}
int main(){
ios::sync_with_stdio(false);
int x, y;
cin >> x >> y;
cout << exponentiation(x, y);
vector<int> z;
/*z = product2Numbers({1, 4, 4}, {1, 2});
for(int i = 0; i < z.size(); i++){
cout << z[i];
}*/
}