#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
char s[maxn];
int n;
int ton[55], fac[maxn], inv[maxn], dp[maxn], f[maxn];
inline int get(char x) {
  if (x >= 'A' && x <= 'Z')
    return x - 'A';
  else
    return 26 + x - 'a';
}
inline int ksm(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = 1ll * ans * a % mod;
    a = 1ll * a * a % mod;
    b >>= 1;
  }
  return ans;
}
inline int am(int x) { return x >= mod ? x - mod : x; }
inline int ad(int x) { return x < 0 ? x + mod : x; }
int ans[55][55];
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i <= n; i++) ton[get(s[i])]++;
  fac[0] = 1;
  for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % mod;
  inv[n] = ksm(fac[n], mod - 2);
  for (int i = n - 1; i >= 1; i--) inv[i] = 1ll * (i + 1) * inv[i + 1] % mod;
  inv[0] = 1;
  int num = 1ll * fac[n / 2] * fac[n / 2] % mod;
  for (int i = 0; i < 52; i++) num = 1ll * num * inv[ton[i]] % mod;
  dp[0] = 1;
  for (int i = 0; i < 52; i++) {
    if (!ton[i]) continue;
    for (int j = n; j >= ton[i]; j--) dp[j] = am(dp[j] + dp[j - ton[i]]);
  }
  for (int i = 0; i < 52; i++) ans[i][i] = dp[n / 2];
  for (int i = 0; i < 52; i++) {
    if (!ton[i]) continue;
    for (int k = 0; k <= n; k++) f[k] = dp[k];
    for (int k = ton[i]; k <= n; k++) {
      f[k] = ad(f[k] - f[k - ton[i]]);
    }
    for (int j = i + 1; j < 52; j++) {
      if (!ton[j]) continue;
      for (int k = ton[j]; k <= n; k++) {
        f[k] = ad(f[k] - f[k - ton[j]]);
      }
      ans[i][j] = am(f[n / 2] + f[n / 2]);
      ans[j][i] = ans[i][j];
      for (int k = n; k >= ton[j]; k--) {
        f[k] = am(f[k] + f[k - ton[j]]);
      }
    }
  }
  int q;
  scanf("%d", &q);
  int x, y;
  while (q--) {
    scanf("%d%d", &x, &y);
    int a = get(s[x]), b = get(s[y]);
    printf("%lld\n", 1ll * num * ans[a][b] % mod);
  }
  return 0;
}
