#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
const int o = 4e5 + 10;
const int mod = 1e9 + 7;
int n, h, m, t, q;
char s[N];
int num[54];
int ask(char c) {
  if (c >= 'a' && c <= 'z') return c - 'a' + 1;
  return c - 'A' + 27;
}
int dp[N], now[N];
long long jc[N], ni[N];
long long w;
void solve() {
  jc[0] = 1;
  for (int i = 1; i <= h; i++) {
    jc[i] = jc[i - 1] * i % mod;
  }
  ni[1] = 1;
  for (int i = 2; i <= h; i++) ni[i] = ni[mod % i] * (mod - mod / i) % mod;
  w = jc[h] * jc[h] % mod;
  for (int k = 1; k <= 52; k++) {
    for (int i = 2; i <= num[k]; i++) w = w * ni[i] % mod;
  }
}
long long check(long long x) { return x >= 0 ? x : x + mod; }
long long ans[54][54];
int a, b;
int main() {
  memset(ans, -1, sizeof(ans));
  scanf(" %s", s + 1);
  n = strlen(s + 1);
  h = n / 2;
  for (int i = 1; i <= n; i++) num[ask(s[i])]++;
  dp[0] = 1;
  for (int k = 1; k <= 52; k++) {
    if (num[k] == 0) continue;
    for (int i = h; i >= num[k]; i--) {
      dp[i] = (dp[i] + dp[i - num[k]]) % mod;
    }
  }
  solve();
  scanf("%d", &q);
  for (int o = 1; o <= q; o++) {
    int x, y;
    scanf("%d%d", &x, &y);
    if (s[x] != s[y]) {
      a = ask(s[x]);
      b = ask(s[y]);
      if (ans[a][b] != -1) {
        printf("%lld\n", ans[a][b]);
        continue;
      }
      x = num[ask(s[x])];
      y = num[ask(s[y])];
      for (int i = 0; i <= h; i++)
        now[i] = i >= x ? check(dp[i] - now[i - x]) : dp[i];
      for (int i = 0; i <= h; i++)
        now[i] = i >= y ? check(now[i] - now[i - y]) : now[i];
      for (int i = h; i >= x + y; i--) now[i] = (now[i] + now[i - x - y]) % mod;
      printf("%lld\n",
             now[h] * w % mod >= 0 ? now[h] * w % mod : now[h] * w % mod + mod);
      ans[a][b] =
          now[h] * w % mod >= 0 ? now[h] * w % mod : now[h] * w % mod + mod;
    } else {
      printf("%lld\n",
             dp[h] * w % mod >= 0 ? dp[h] * w % mod : dp[h] * w % mod + mod);
    }
  }
  return 0;
}
