#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>

#define JA_POLUDIM (7-7)

using namespace std;

class bignum{
private:
      string br;
 
public:
   bignum  ( char c   ) : br ( (c == '_' ) ? ( "" ) : ( ( c >='0' && c<='9') ? (tostring(c-'0')) : ( "0"))){}
      bignum  (          ) : br ("0") {}
      bignum  ( string s ) : br ( s ) {}
     bignum  ( int b    ) : br ( tostring ( b ) ) {}
 
     
private:
      void vodece_nule ( ){
                     for (int k=0;k<br.size();++k) if ( br[k]!='0' ) {br = br.substr ( k ); return;}
                     br = "0";return ;    
                  }
public:
      void ispisi ( ){cout << br << endl;}
      
     void ispisi_ (){cout << br;}           
      
      
      bool parno ( ) { return 1 - ( br[br.size() - 1 ] - '0' ) % 2 ; }
            
      bool operator < ( bignum d ){
                if ( br.length() < d.br.length() ) return true;
                 if ( br.length() > d.br.length() ) return false;
                 int i =0 ;         
                while ( br[i] == d.br[i] && i < br.size()) ++i;
               if ( i == br.size() ) --i;
                return br[i] < d.br[i];
             }
            
      bool operator < ( string d ){
                if ( br.length() < d.length() ) return true;
                 if ( br.length() > d.length() ) return false;
                 int i = 0;
                 while ( br[i] == d[i]  && i < br.length() ) ++i;
                 if ( i == br.length() ) --i;
                return br[i] < d[i];
           }
      
      bool operator > ( bignum d ){
                 if ( br.length() > d.br.length() ) return true;
                 if ( br.length() < d.br.length() ) return false;
                 int i = 0;
                 while ( br[i] == d.br[i] && i < br.size()) ++i;
                 if ( i == br.size() ) --i;
                 return br[i] > d.br[i];
           }
     
     bool operator > ( string d ){
                 if ( br.length() > d.length() ) return true;
                 if ( br.length() < d.length() )return false ;
                 int i = 0 ;
                 while ( br[i] == d[i] ) ++i;
                if ( i == br.size() ) --i;
                 return br[i] > d[i];           
           }
           
      bool operator == ( bignum d ){
                 if ( br.length() != d.br.length() ) return false;
                 for (int k=0;k<br.length();++k) if ( br[k] != d.br[k] ) return false;
                return true;
          }
     
      bool operator == ( string d ){
                 if ( br.length() != d.length() ) return false;
                 for (int k=0;k<br.length();++k) if ( br[k] != d[k] ) return false;
                 return true;
          }
      
      bool operator != ( bignum d ){
                 if ( d == br ) return false;
                 return true;
          }
           
     bool operator <= ( bignum d ){ return (( d > br ) ||  (d == br )); }
          
      bool operator >= ( bignum d ){ return (( d < br) ||  (d == br ));}
      
      bignum operator -- (){br = (bignum ( br) - bignum("1")).br;}
             
      bignum operator ++ (){ br = (bignum (br) + bignum ("1")).br;} // ovde nekaj steka npr. while ( a < b ) ++a;
             
      bignum operator + ( bignum d ){
             bignum ret ( '_' );
            int ost = 0;
                for (int k = br.size() - 1 , j = d.br.size() - 1; k >= 0 || j >= 0 ; --k, --j ){
                    if ( k >= 0 && j >= 0 ) ret.br.push_back ( (br[k] + d.br[j] - 2*('0') + ost) % 10 + '0'  ) , ost =(br[k] + d.br[j] - 2*('0') + ost) / 10 ;
                    else
                if ( k >= 0 ) ret.br.push_back( (br[k] -'0' + ost ) % 10 + '0') , ost = (br[k] -'0' + ost ) / 10;
                else
                   if ( j >= 0 ) ret.br.push_back( (d.br[j] -'0' + ost ) % 10 + '0') , ost = (d.br[j] -'0' + ost ) / 10;
                   }
              if ( ost ) ret.br.push_back ( '1' );
              reverse ( ret.br.begin(), ret.br.end());
              return ret;      
             }
             
      bignum operator - ( bignum d ){
            if ( d > br ) return bignum();
           bignum ret ( '_' );
             int ost = 0;
           for (int k=br.size() - 1 , j = d.br.size() - 1; k>=0 || j>=0 ; --k, --j ){
                if ( k >= 0 && j >= 0 ){
                        if ( br[k] >= d.br[j] + ost) ret.br.push_back ( br[k] - d.br[j] - ost + '0'), ost = 0;
                        else ret.br.push_back ( 10 + (br[k]-'0') - ( d.br[j] -'0' ) - ost + '0' ), ost = 1;  
                     }
                 else {
                       if ( br[k] - '0' >= ost ) ret.br.push_back ( br[k] - ost ) , ost = 0;
                                            else ret.br.push_back ( 10 + br[k] - ost ) ,ost = 1;
                      }
                 }
             reverse ( ret.br.begin(), ret.br.end());
             ret.vodece_nule();
            return ret; 
             }
      
      bignum operator / ( int d ){
             if ( d < 0 ) return bignum ( br );
             if ( bignum ( br ) < bignum ( d ) ) return bignum ("0");
             bignum ret ('_');
            int ost = 0, i = 0, tmp = 0;
             tmp = toint ( br.substr ( 0, znam( d ) ) ) ;
            i = znam(d);
            if ( tmp < d ) tmp = toint ( br.substr ( 0, znam ( d ) + 1 ) ), i = znam(d) + 1 ;
           ret.br.push_back ( tmp / d +'0' ) ;
             ost = tmp % d ;
             for (int k=i;k<br.size();++k){
                   ost = ost * 10 + br[k]-'0';
                  ret.br.push_back ( ost / d +'0' );
                   ost = ost % d;
                 }
             return ret;
             }
             
      bignum operator * ( int d ){
             if ( d < 0 ) return bignum ( br );
             bignum ret('_');
             int ost = 0;
           for (int k=br.size() - 1 ;k>=0;--k){
                  ret.br.push_back ( (d * (br[k]-'0') + ost ) % 10 + '0');
                   ost = ( d * (br[k] - '0' ) + ost) / 10;
                 }
             while( ost ) {
                    ret.br.push_back ( ost % 10 +'0');
                   ost/=10;
                    }
           reverse ( ret.br.begin(), ret.br.end());
             ret.vodece_nule();
             return ret;
             }
             
      bignum operator * ( bignum d ){
             bignum t ( br ), ret;
             while ( 1 ){
                  if ( !t.parno() ) ret = ret+d; 
                   t=t/2;
                   d=d*2;
                  if ( t.br == "0" ) break;
                   }
            return ret;
             }
             
      bignum operator % ( int d ){
            if ( d < 0 ) return 0;
             if ( bignum ( br ) < bignum ( d ) ) return 0;
             bignum ret ('_');
            int ost = 0, i = 0, tmp = 0;
             tmp = toint ( br.substr ( 0, znam( d ) ) ) ;
            i = znam(d);
             if ( tmp < d ) tmp = toint ( br.substr ( 0, znam ( d ) + 1 ) ), i = znam(d) + 1 ;
             ret.br.push_back ( tmp / d +'0' ) ;
             ost = tmp % d ;
             for (int k=i;k<br.size();++k){
                   ost = ost * 10 + br[k]-'0';
                   ret.br.push_back ( ost / d +'0' );
                   ost = ost % d;
                 }
             return bignum (ost);
         }  
          
      bignum operator ^ ( int d ){
              if ( d == 0 ) return bignum ( br ) ;
             bignum ret("1"), buff;
             buff = bignum ( br );
             for (int k=0;k<d;++k){
                    ret = ret * buff;
                  }
          return ret;
            }
      
      void operator += ( bignum d ){
             br = (bignum (br) + d ).br;
             return;
             }
             
      void operator -= ( bignum d ){
            br = (bignum (br) - d ).br;
            return;
           }
           
      void operator *= ( bignum d ){
             br = (bignum (br) * d ).br;
             return;
           }
           
      void operator *= ( int d    ){
             br = (bignum (br) * d ).br;
             return;
           }
           
      void operator /= ( int d    ){
             br = (bignum (br) / d ).br;
             return;
           }
           
      void operator %= ( int d    ){
             br = (bignum (br) % d ).br;
             return;
           }
           
      private:
              int znam ( int broj ){
              int brojac = 0;
               while ( broj ) {
                ++brojac;
                broj/=10;
                }
                return brojac;
                }                
                string tostring ( int broj ){
                       char tmp[20];
                       sprintf (tmp, "%d", broj);
                return tmp;
                }
 
           int toint ( string tmp ){
               int buff;
               sscanf ( tmp.c_str(), "%d", &buff );
              return buff;
           }
   
      };

int main(void) {
    string s1; int base;
    cin>>s1>>base;
    bignum broj = s1;
    bignum poc = 1;
    long long ret = 2;
    if (broj == 1) cout<<1<<endl;
    while ( poc != broj) {
          poc = 1;
          for (int i = 0; i < base; i++) {
              poc *=  ret;
              }
         // cout<<poc<<endl;
    ret++;
}
cout<<ret-1<<endl;
//system("pause");
return JA_POLUDIM;
}
