#include <bits/stdc++.h>
using namespace std;
template <class T>
void debug(T a, T b) {
  ;
}
template <class T>
void chmin(T& a, const T& b) {
  if (a > b) a = b;
}
template <class T>
void chmax(T& a, const T& b) {
  if (a < b) a = b;
}
namespace std {
template <class S, class T>
ostream& operator<<(ostream& out, const pair<S, T>& a) {
  out << '(' << a.first << ',' << a.second << ')';
  return out;
}
}  // namespace std
const int MX = 1000000;
int prm[1000005];
vector<int> g[1000005];
const int STEP = 15;
int m;
vector<pair<long long int, long long int> > range[1000005];
long long int init[1000005];
long long int res[1000005];
int main() {
  memset(prm, 1, sizeof(prm));
  prm[0] = prm[1] = 0;
  for (int i = 2; i * i <= MX; ++i)
    if (prm[i]) {
      for (int j = i + i; j <= MX; j += i) prm[j] = 0;
    }
  for (int i = 2; i <= MX; ++i)
    if (prm[i]) {
      for (int j = i; j <= MX; j += i) {
        int tmp = j, cnt = 0;
        while (tmp % i == 0) {
          tmp /= i;
          ++cnt;
        }
        for (int hoge = 0; hoge < (cnt); ++hoge) g[j + 1].push_back(i);
      }
    }
  cin >> m;
  for (int hoge = 0; hoge < (m); ++hoge) {
    int p;
    long long int a;
    scanf("%d", &p);
    scanf("%I64d", &a);
    init[p] = a;
    range[p].push_back(make_pair(0, a));
  }
  long long int k;
  cin >> k;
  {
    for (int i = MX; i >= 0; --i)
      if (!range[i].empty()) {
        ;
        ;
        sort((range[i]).begin(), (range[i]).end());
        long long int till = range[i][0].first, st = range[i][0].first;
        for (auto r : range[i]) {
          if (till < r.first) {
            if (st + 1 < min(k + 1, till + 1)) {
              for (auto to : g[i]) {
                range[to].push_back(make_pair(st + 1, min(k + 1, till + 1)));
              }
            }
            st = r.first;
            till = r.first;
          }
          till += r.second - r.first;
        }
        if (st + 1 < min(k + 1, till + 1)) {
          for (auto to : g[i]) {
            range[to].push_back(make_pair(st + 1, min(k + 1, till + 1)));
          }
        }
        if (till < k) {
          ;
        } else {
          res[i] = till - k;
        }
      }
    int line = 0;
    for (int i = 0; i < (MX + 1); ++i)
      if (res[i] > 0) {
        ++line;
      }
    cout << line << endl;
    for (int i = 0; i < (MX + 1); ++i)
      if (res[i] > 0) {
        printf("%d %I64d\n", i, res[i]);
      }
  }
  return 0;
}
