#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
namespace IO {
const int L = 1 << 15;
char ibuf[L | 1], *iS = ibuf, *iT = ibuf, obuf[L | 1], *oS = obuf,
                  *oT = obuf + L, c, st[66];
int tp = 0, f;
inline char gc() {
  if (iS == iT) iT = (iS = ibuf) + fread(ibuf, sizeof(char), L, stdin);
  return (*iS++);
}
inline void flush() {
  fwrite(obuf, sizeof(char), oS - obuf, stdout);
  oS = obuf;
}
inline void pc(char c) {
  *oS++ = c;
  if (oS == oT) flush();
}
inline long long read() {
  long long x = 0;
  f = 1, c = gc();
  for (; !isdigit(c); c = gc())
    if (c == '-') f = -1;
  for (; isdigit(c); c = gc()) x = (x << 1) + (x << 3) + (c & 15);
  return x * f;
}
inline void write(long long x) {
  if (!x) pc('0');
  if (x < 0) pc('-'), x = -x;
  while (x) st[++tp] = x % 10 + '0', x /= 10;
  while (tp) pc(st[tp--]);
}
inline void writeln(long long x) {
  write(x);
  pc('\n');
}
struct IOflusher {
  ~IOflusher() { flush(); }
} _ioflusher_;
}  // namespace IO
using IO::gc;
using IO::pc;
using IO::read;
using IO::write;
using IO::writeln;
const int maxn = 1e6 + 233;
char a[maxn], b[maxn];
int n;
void f(int k, int d) {
  int up = ((k + d - 1) / d);
  for (int l = 0; l < n - k + 1; ++l) {
    int r = l + k;
    for (register int t = (l); t < int(r); ++t) b[t] = a[t];
    for (register int i = (0); i < int(k); ++i) {
      int j;
      if (k % d == 0 || i % d < k % d) {
        j = i * up - i / d * (d * up - 1);
      } else {
        j = i * (up - 1) - i / d * (d * up - d - 1) + k % d;
      }
      a[l + j] = b[l + i];
    }
  }
}
int nxt[maxn][22];
inline void g(int k, int d) {
  int lg = 0;
  for (int x = 1; x < n; x <<= 1, lg++)
    ;
  memcpy(b, a, n * sizeof(char));
  register int up = ((k + d - 1) / d);
  for (register int i = (0); i < int(k); ++i) {
    int j;
    if (k % d == 0 || i % d < k % d)
      j = i * up - i / d * (d * up - 1);
    else
      j = i * (up - 1) - i / d * (d * up - d - 1) + k % d;
    nxt[i][0] = j - 1;
  }
  for (register int t = (1); t < int(lg); ++t) {
    for (register int i = (0); i < int(k); ++i) {
      if (nxt[i][t - 1] == -1)
        nxt[i][t] = -1;
      else
        nxt[i][t] = nxt[nxt[i][t - 1]][t - 1];
    }
  }
  for (register int i = (0); i < int(n); ++i) {
    int mxT = min(n - i, n - k + 1), pos;
    if (k - 1 < i)
      pos = k - 1;
    else
      pos = i;
    for (register int j = (lg - 1); j >= int(0); --j) {
      int tmp = (1 << j);
      if ((mxT >= tmp) && nxt[pos][j] != -1) {
        mxT -= tmp;
        pos = nxt[pos][j];
      }
    }
    if (mxT && nxt[pos][0] == -1) {
      a[n - mxT - k + 1] = b[i];
    } else {
      a[n - k + pos + 1] = b[i];
    }
  }
}
int main() {
  scanf("%s", a);
  n = strlen(a);
  int m = read();
  while (m--) {
    int k = read(), d = read();
    g(k, d);
    for (register int i = (0); i < int(n); ++i) pc(a[i]);
    pc('\n');
  }
  return 0;
}
