#include <bits/stdc++.h>
using namespace std;
int gcd(long long a, int b) {
  if (a < b) {
    return gcd(b, a);
  }
  if (b == 0) {
    return a;
  }
  return gcd(b, a % b);
}
class Triplet {
 public:
  long long gcd;
  long long x;
  long long y;
};
Triplet gcdExtendedEuclid(int a, int b) {
  if (b == 0) {
    Triplet myAns;
    myAns.gcd = a;
    myAns.x = 1;
    myAns.y = 0;
    return myAns;
  }
  Triplet smallAns = gcdExtendedEuclid(b, a % b);
  Triplet myAns;
  myAns.gcd = smallAns.gcd;
  myAns.x = smallAns.y;
  myAns.y = (smallAns.x - ((a / b) * (smallAns.y)));
  return myAns;
}
long long modInverse(int A, int M) {
  Triplet ans = gcdExtendedEuclid(A, M);
  return ans.x;
}
bool check(vector<long long>& v1, long long val, long long h) {
  long long ans = 0;
  for (long long i = 0; i < v1.size(); i++) {
    ans += v1[i] / val;
    if (v1[i] % val != 0) {
      ans += 1;
    }
  }
  if (ans > h) {
    return false;
  }
  return true;
}
void multiply(long long A[2][2], long long M[2][2]) {
  long long firstValue = (A[0][0] * M[0][0] + A[0][1] * M[1][0]) % 1000000007;
  long long secondValue = (A[0][0] * M[0][1] + A[0][1] * M[1][1]) % 1000000007;
  long long thirdValue = (A[1][0] * M[0][0] + A[1][1] * M[1][0]) % 1000000007;
  long long fourthValue = (A[1][0] * M[0][1] + A[1][1] * M[1][1]) % 1000000007;
  A[0][0] = firstValue;
  A[0][1] = secondValue;
  A[1][0] = thirdValue;
  A[1][1] = fourthValue;
  return;
}
void getpow(long long A[2][2], long long n) {
  if (n == 0 || n == 1) {
    return;
  }
  getpow(A, n / 2);
  multiply(A, A);
  if (n % 2 != 0) {
    long long first[2][2] = {{1, 1}, {1, 0}};
    multiply(A, first);
  }
  return;
}
long long getpow1(long long n, long long m, long long b) {
  if (m == 0) {
    return 1;
  }
  long long ans = getpow1(n, m / 2, b) % b;
  ans = (ans * ans) % b;
  if (m % 2 != 0) {
    ans = ans * n % b;
  }
  return ans % b;
}
long long getfib(long long n) {
  if (n == 0) {
    return 0;
  }
  long long A[2][2] = {{1, 1}, {1, 0}};
  getpow(A, n);
  long long first[1][2];
  first[0][0] = 0;
  first[0][1] = 1;
  long long ans = first[0][0] * A[0][0] + first[0][1] * A[1][0];
  return ans % 1000000007;
}
vector<long long>* sieve() {
  bool isprime[1000001];
  for (long long i = 0; i < 1000001; i++) {
    isprime[i] = true;
  }
  vector<long long>* primes = new vector<long long>();
  for (long long i = 2; i < 1000001; i++) {
    if (isprime[i] == true) {
      for (long long j = 2 * i; j < 1000001; j += i) {
        isprime[j] = false;
      }
    }
  }
  primes->push_back(2);
  for (long long i = 3; i < 1000001; i++) {
    if (isprime[i] == true) {
      primes->push_back(i);
    }
  }
  return primes;
}
long long getpow2(long long a, string& b, long long m) {
  long long mod = 1000000007;
  long long num = 1;
  for (long long i = b.size() - 1; i >= 0; i--) {
    if (b[i] == 1) {
      num = (num * a) % m;
    } else if (b[i] == 2) {
      num = ((num * a) % m * a) % m;
    }
    a = ((a * a) % m * a) % m;
  }
  return num % m;
}
long long arr[5000001];
long long res[1000001];
long long res1[1000001];
int main() {
  long long k, n;
  cin >> k >> n;
  long long num = 0;
  long long k1 = k;
  while (k1 < n) {
    k1 *= k;
    num++;
  }
  if (k1 == n) {
    cout << "YES" << '\n';
    cout << num;
    return 0;
  }
  cout << "NO" << '\n';
  return 0;
}
