#include <bits/stdc++.h>
using namespace std;
void setIO(string name) {
  string in_f = name + ".in";
  string out_f = name + ".out";
  freopen(in_f.c_str(), "r", stdin);
  freopen(out_f.c_str(), "w", stdout);
}
const int N = 1111111;
int TT = 0;
struct Replace {
  int size;
  vector<int> a;
  void init(int n) {
    size = n;
    a.push_back(0);
    for (int i = 1; i <= n; ++i) a.push_back(i);
  }
  Replace operator*(const Replace &p) const {
    Replace ret;
    ret.init(size);
    for (int i = 1; i <= size; ++i) {
      ret.a[i] = p.a[a[i]];
    }
    return ret;
  }
  void print() {
    for (int i = 1; i <= size; ++i)
      printf("%d%c", a[i], i == size ? '\n' : ' ');
  }
} now, tra1, tra2, tra3, tmp;
int n, Q;
char str[N];
char ans[N];
int k, d;
void pow(Replace &a, int b) {
  Replace ret;
  ret.init(n);
  while (b) {
    if (b & 1) ret = ret * a;
    a = a * a, b >>= 1;
  }
  a = ret;
}
int main() {
  scanf("%s", str + 1);
  n = strlen(str + 1);
  now.init(n);
  scanf("%d", &Q);
  tra1.init(n);
  tra2.init(n);
  tra3.init(n);
  for (int i = 1; i <= n; ++i) {
    if (i == 1)
      tra2.a[i] = n;
    else
      tra2.a[i] = i - 1;
  }
  while (Q--) {
    scanf("%d %d", &k, &d);
    for (int i = 1; i <= n; ++i) {
      if (i <= k) {
        int pos;
        if ((i - 1) % d <= k % d) {
          pos = (i - 1) % d * (k / d + 1) + (i - 1) / d + 1;
        } else {
          pos = (i - 1) % d * (k / d) + k % d + (i - 1) / d + 1;
        }
        tra1.a[i] = pos - 1;
      } else {
        tra1.a[i] = i - 1;
      }
      if (tra1.a[i] == 0) tra1.a[i] = n;
    }
    for (int i = 1; i <= n; ++i) {
      tra3.a[i] = i - (k - 1);
      if (tra3.a[i] <= 0) tra3.a[i] += n;
    }
    pow(tra1, n - k + 1);
    now = now * tra1 * tra3;
    for (int i = 1; i <= n; ++i) {
      ans[now.a[i]] = str[i];
    }
    ans[n + 1] = '\0';
    puts(ans + 1);
  }
  for (int i = 1; i <= 120000; ++i)
    ;
  return 0;
}
