#include <bits/stdc++.h>
using namespace std;
int divs[1001000 + 1];
vector<int> L[1001000 + 1];
long long last[1001000 + 1];
long long v[1001000 + 1];
int in[1001000 + 1];
long long aux[1001000 + 1];
int main() {
  for (int i = 2; i < 1001000; i++)
    if (divs[i] == 0)
      for (int j = 1; i * j < 1001000; j++) divs[i * j] = i;
  for (int i = 2; i < 1001000; i++)
    if (divs[i] == i) {
      int t = i - 1;
      while (t - 1) L[i].push_back(divs[t]), t /= divs[t];
    }
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    long long p, t;
    scanf("%I64d%I64d\n", &p, &t);
    v[p] += t;
  }
  long long k;
  scanf("%I64d", &k);
  for (int i = 0; i < min(20LL, k); i++) {
    for (int j = 1; j < 1001000; j++) aux[j] = v[j];
    for (int j = 1; j < 1001000; j++)
      if (v[j]) {
        aux[j]--;
        for (vector<int>::iterator it = L[j].begin(); it < L[j].end(); it++)
          aux[*it]++;
      }
    for (int j = 1; j < 1001000; j++) v[j] = aux[j];
  }
  for (int i = 2; i < 1001000; i++)
    if (v[i]) {
      in[i]--;
      for (vector<int>::iterator it = L[i].begin(); it < L[i].end(); it++)
        in[*it]++;
      last[i] = min(20LL, k);
    }
  set<pair<long long, long long> > st;
  long long foi = min(20LL, k);
  for (int i = 2; i < 1001000; i++)
    if (in[i] == -1) {
      long long t = foi + v[i];
      st.insert(pair<long long, long long>(t, i));
    }
  while (foi < k && st.size()) {
    pair<long long, long long> u = *st.begin();
    st.erase(u);
    long long muda = u.first - foi;
    if (u.first >= k) {
      foi = k;
      continue;
    }
    foi = u.first;
    int p = u.second;
    v[p] = 0;
    in[p] = 0;
    for (vector<int>::iterator it = L[p].begin(); it < L[p].end(); it++) {
      v[*it] += (foi - last[*it]) * in[*it];
      last[*it] = foi;
      in[*it]--;
      if (in[*it] == -1) {
        long long t = foi + v[*it];
        st.insert(pair<long long, long long>(t, *it));
      }
    }
  }
  vector<pair<long long, long long> > ans;
  for (int i = 2; i < 1001000; i++) {
    if (k <= 20) in[i] = 0;
    long long q = v[i] + (k - last[i]) * in[i];
    if (q) ans.push_back(pair<long long, long long>(i, q));
  }
  sort(ans.begin(), ans.end());
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%I64d %I64d\n", ans[i].first, ans[i].second);
}
