#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int BASE = 10;

char in [ 30005 ];

class Bignum {
public:
   short dig [ 60025 ];
   int N;
   
   Bignum ( ){
      memset ( dig, 0, sizeof(dig) );
      N = 0;
   }

   void read ( void ){
      scanf("%s",in);
      N = strlen(in);
      for ( int i = 0; i < N; ++i )
         dig[i] = in[N-i-1] - '0';
      
   }
   
   Bignum operator * ( const Bignum B ){
      Bignum ret;
      int carry = 0;
      
      for ( int i = 0; i < N; ++i ){
         carry = 0;
         for ( int j = 0; j < B.N; ++j ){
            int rdig = ret.dig[i+j] + dig[i] * B.dig[j] + carry;
            ret.dig[i+j] = rdig % BASE;
            carry = rdig / BASE;
         }
         ret.dig[i+B.N] = carry;
      }     
      
      ret.N = N + B.N;
      while ( ret.N > 1 && ret.dig[ret.N-1] == 0 )
         --ret.N;
      
      return ret;
   }
   
   Bignum div2 ( void ){
      Bignum ret;
      int carry = 0;
      
      for ( int i = N - 1; i >= 0; --i ){
         carry = carry * BASE + dig[i];
         ret.dig[i] = carry / 2;
         carry %= 2;
      }
      ret.N = N;
   
      while ( ret.N > 1 && ret.dig[ret.N-1] == 0 )
         --ret.N;
         
      return ret;
   }
   
   Bignum operator + ( const Bignum &B ){
    int carry = 0;
    Bignum ret = (*this);
    ret.N = max ( N, B.N );
    
    for( int i = 0; i < ret.N; ++i ){
      ret.dig[i] += B.dig[i] + carry;
      carry = ret.dig[i] / BASE;
      ret.dig[i] %= BASE;
    }
    if (carry > 0) 
         ret.dig[ret.N++] = carry;
    return ret;
  }
  
  Bignum operator - ( const Bignum &B ){
      int carry = 0;
      Bignum ret = (*this);
      
      for ( int i = 0; i < ret.N; ++i ){
         ret.dig[i] = ret.dig[i] - B.dig[i] - carry;
         if ( ret.dig[i] < 0 ){
            ret.dig[i] += BASE;
            carry = 1;
          }
          else 
            carry = 0;
      }
      
      while ( ret.N > 1 && ret.dig[ret.N-1] == 0 )
         --ret.N;
         
      return ret;
      }
      
   bool operator == ( const Bignum &B ){
      if ( N != B.N ) return false;
      for ( int i = 0; i < N; ++i )
         if ( dig[i] != B.dig[i] )
            return false;
      return true;
   }  
   
   bool operator < ( const Bignum &B ){
      if ( N != B.N ) return N < B.N;
      for ( int i = N - 1; i >= 0; --i )
         if ( dig[i] != B.dig[i] )
            return dig[i] < B.dig[i];
      return false;
   }              
   
   void print ( void ){
      printf("%d",dig[N-1]);
      for ( int i = N - 2; i >= 0; --i )
         printf("%d",dig[i]);
      puts("");
   }

};

Bignum jed;

Bignum pow ( Bignum X, int n ){
   if ( n == 1 ) return X;
   if ( !(n%2) ){
      Bignum ret = pow(X,n/2);
      return ret * ret;
   }
   else
      return X * pow(X,n-1);
}
   
Bignum A;
int pot;
Bignum lo;
Bignum hi = A;
Bignum mid, sqr;
   
int main ( void ){
   jed.N = 1;
   jed.dig[0] = 1;
   A.read();
   scanf("%d",&pot);
         
   lo.N = 1;
   lo.dig[0] = 1;
   hi = A;
  
   int iter = 0;
                  
   while ( true ){
      mid = lo + hi;
      mid = mid.div2();
      
      sqr = pow ( mid, pot ); 
      
      if ( sqr == A )
         break;
      
      if ( sqr < A )
         lo = mid + jed;
      else
         hi = mid - jed; 
      
   }
      
   mid.print();
      
   
   return 0;
}
