#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
const long long mod = 1e9 + 7;
char s[maxn];
int num[55];
long long dp[maxn];
long long tmp[maxn];
long long quesnum[55][55];
long long ques[55][55];
long long inv[maxn], fac[maxn], invf[maxn];
void init(int hf) {
  inv[1] = 1;
  for (int i = 2; i < maxn; i++)
    inv[i] = ((mod - mod / i) * inv[mod % i]) % mod;
  fac[0] = 1;
  for (int i = 1; i < maxn; i++) fac[i] = (fac[i - 1] * (long long)i) % mod;
  invf[0] = 1;
  for (int i = 1; i < maxn; i++) invf[i] = (invf[i - 1] * inv[i]) % mod;
  memset(dp, 0, sizeof(dp));
  memset(ques, -1, sizeof(ques));
  dp[0] = 1;
  for (int i = 0; i < 55; i++) {
    if (!num[i]) continue;
    for (int j = hf; j >= num[i]; j--) {
      dp[j] = (dp[j] + dp[j - num[i]]) % mod;
    }
  }
  for (int i = 0; i < 52; i++) {
    for (int j = i; j < 52; j++) {
      for (int k = 0; k <= hf; k++) tmp[k] = dp[k];
      for (int k = num[i]; k <= hf; k++)
        tmp[k] = (tmp[k] - tmp[k - num[i]] + mod) % mod;
      if (i != j)
        for (int k = num[j]; k <= hf; k++)
          tmp[k] = (tmp[k] - tmp[k - num[j]] + mod) % mod;
      quesnum[i][j] = quesnum[j][i] = tmp[hf];
    }
  }
}
int main() {
  scanf("%s", s);
  memset(num, 0, sizeof(num));
  int len = strlen(s);
  int hf = len / 2;
  for (int i = 0; i < len; i++) {
    if (s[i] >= 'a' && s[i] <= 'z')
      num[s[i] - 'a']++;
    else
      num[s[i] - 'A' + 26]++;
  }
  init(hf);
  int q;
  scanf("%d", &q);
  int x, y;
  while (q--) {
    scanf("%d%d", &x, &y);
    x--;
    y--;
    int idx, idy;
    if (s[x] >= 'a' && s[x] <= 'z')
      idx = s[x] - 'a';
    else
      idx = s[x] - 'A' + 26;
    if (s[y] >= 'a' && s[y] <= 'z')
      idy = s[y] - 'a';
    else
      idy = s[y] - 'A' + 26;
    if (ques[idx][idy] != -1) {
      printf("%I64d\n", ques[idx][idy]);
      continue;
    }
    long long ans;
    if (idx == idy) {
      if (num[idx] > hf) {
        printf("0\n");
        ques[idx][idx] = 0;
        continue;
      }
      long long cc =
          ((fac[hf] * invf[num[idx]]) % mod * invf[hf - num[idx]]) % mod;
      ans = ((cc * fac[hf - num[idx]]) % mod * fac[hf]) % mod;
    } else {
      if (num[idx] + num[idy] > hf) {
        ques[idx][idy] = ques[idy][idx] = 0;
        printf("0\n");
        continue;
      }
      int numx = num[idx], numy = num[idy];
      int num_hfx = hf - numx;
      long long cc1 = ((fac[hf] * invf[numx]) % mod * invf[hf - numx]) % mod;
      long long cc2 =
          ((fac[num_hfx] * invf[numy]) % mod * invf[num_hfx - numy]) % mod;
      ans = (((cc1 * cc2) % mod * fac[hf]) % mod * fac[hf - numx - numy]) % mod;
    }
    for (int i = 0; i < 55; i++) {
      if (i == idx || i == idy) continue;
      ans = (ans * invf[num[i]]) % mod;
    }
    ans = (ans * quesnum[idx][idy]) % mod;
    ans = (ans * 2) % mod;
    ques[idx][idy] = ques[idy][idx] = ans;
    printf("%I64d\n", ans);
  }
}
