#include <bits/stdc++.h>
using namespace std;
bool p[31624];
vector<int> pr;
int gcd(int a, int b) { return a % b == 0 ? b : gcd(b, a % b); }
void pre() {
  for (int i = 2; i <= 31623; i++) {
    if (!p[i]) {
      for (int j = i * 2; j <= 31623; j += i) p[j] = 1;
      pr.push_back(i);
    }
  }
  return;
}
bool chk(int x) {
  if (x == 2) return 1;
  for (int i = 0; i < pr.size() && pr[i] < x; i++) {
    if (x % pr[i] == 0) {
      while (x % pr[i] == 0) x /= pr[i];
      if (x > 1) return 0;
      return 1;
    }
  }
  return 1;
}
vector<int> ans;
int lf(int x) {
  for (int i = 0; i < pr.size(); i++) {
    if (x % pr[i] == 0) return pr[i];
  }
  return x;
}
int n;
bool work(int x) {
  for (int i = 2; i <= sqrt(x); i++) {
    if (x % i) continue;
    for (int j = 1; j < i; j++) {
      int c = j * (x / i);
      if (gcd(c, n) != 1 && gcd((n - 1) - c, n) != 1) {
        ans.push_back(c);
        ans.push_back(n - 1 - c);
        printf("YES\n%d\n", ans.size());
        for (int i = 0; i < ans.size(); i++) {
          int g = gcd(n, ans[i]);
          printf("%d %d\n", ans[i] / g, n / g);
        }
        return 1;
        ;
      }
    }
  }
  return 0;
}
int main() {
  cin >> n;
  pre();
  if (chk(n)) {
    puts("NO");
    return 0;
  }
  int np = n - 1, lst = n - 1;
  if (work(n)) return 0;
  while (np) {
    if (gcd(np, n) == 1 || gcd(lst % np, n) == 1)
      np--;
    else {
      int ned = lst / np;
      lst %= np;
      for (int i = 1; i <= ned; i++) ans.push_back(np);
      np = lst;
    }
  }
  if (lst) {
    puts("NO");
    return 0;
  }
  printf("YES\n%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++) {
    int g = gcd(n, ans[i]);
    printf("%d %d\n", ans[i] / g, n / g);
  }
  return 0;
}
