#include <bits/stdc++.h>
using namespace std;
const int def = 1000000;
long long n, i, k;
long long p, x;
vector<pair<long long, long long> > divs[1000011], intr[1000011], aux;
bool prime[1000011];
long long ans[1000011];
void pre() {
  long long i, j, cnt, x, pp;
  for (i = 1; i <= def; i++) divs[i].reserve(5);
  for (i = 2; i <= def; i++) {
    if (divs[i].size()) continue;
    prime[i] = true;
    for (j = i; j <= def; j += i) {
      cnt = 0;
      x = j;
      while (x % i == 0) cnt++, x /= i;
      divs[j].push_back(make_pair(i, cnt));
    }
  }
}
void solve(int id) {
  long long i, cnt;
  if (intr[id].empty()) return;
  aux = intr[id];
  intr[id].clear();
  sort(aux.begin(), aux.end());
  intr[id].push_back(aux[0]);
  for (i = 1; i < aux.size(); i++) {
    if (aux[i].first > intr[id].back().second)
      intr[id].push_back(aux[i]);
    else
      intr[id].back().second += aux[i].second - aux[i].first + 1;
  }
  for (i = 0; i < intr[id].size(); i++) {
    if (intr[id][i].second <= k) continue;
    if (intr[id][i].first <= k) {
      ans[id] += intr[id][i].second - k;
      intr[id][i].second = k;
    } else {
      ans[id] += intr[id][i].second - intr[id][i].first + 1;
      intr[id][i] = intr[id].back();
      intr[id].pop_back();
      i--;
    }
  }
  for (auto act : intr[id]) {
    for (auto e : divs[id - 1]) {
      for (cnt = 1; cnt <= e.second; cnt++)
        intr[e.first].push_back(make_pair(act.first + 1, act.second + 1));
    }
  }
}
int main() {
  pre();
  scanf("%lld", &n);
  for (i = 1; i <= n; i++) {
    scanf("%lld%lld", &p, &x);
    intr[p].push_back(make_pair(1, x));
  }
  scanf("%lld", &k);
  for (i = def; i >= 2; i--) solve(i);
  long long sol = 0;
  for (i = 1; i <= def; i++)
    if (ans[i]) sol++;
  printf("%lld\n", sol);
  for (i = 1; i <= def; i++)
    if (ans[i]) printf("%lld %lld\n", i, ans[i]);
  return 0;
}
