#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int mod = 1e9 + 7;
char s[100010];
int id(char c) {
  if ('a' <= c && c <= 'z') return c - 'a';
  return c - 'A' + 26;
}
int num[55];
long long pw(long long a, int n) {
  long long res = 1;
  while (n) {
    if (n & 1) res = res * a % mod;
    a = a * a % mod, n >>= 1;
  }
  return res;
}
long long INV(long long a) { return pw(a, mod - 2); }
long long fac[100010], inv[100010];
void add(long long &a, long long b) {
  a += b;
  if (a > mod) a -= mod;
}
void sub(long long &a, long long b) {
  a -= b;
  if (a < 0) a += mod;
}
void pre() {
  fac[0] = 1;
  for (int i = 1; i < 100010; i++) fac[i] = fac[i - 1] * i % mod;
  inv[100010 - 1] = INV(fac[100010 - 1]);
  for (int i = 100010 - 2; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
}
long long dp[100010];
long long ans[55][55];
int main() {
  pre();
  scanf("%s", s);
  int n = strlen(s), k = 52;
  for (int i = 0; i < n; i++) num[id(s[i])]++;
  long long umr = fac[n / 2] * fac[n / 2] % mod;
  for (int i = 0; i < k; i++) umr = umr * inv[num[i]] % mod;
  dp[0] = 1;
  for (int i = 0; i < k; i++) {
    if (!num[i]) continue;
    for (int j = n; j >= num[i]; j--) add(dp[j], dp[j - num[i]]);
  }
  for (int i = 0; i < k; i++) ans[i][i] = dp[n / 2];
  for (int i = 0; i < k; i++) {
    if (!num[i]) continue;
    for (int j = num[i]; j <= n; j++) sub(dp[j], dp[j - num[i]]);
    for (int j = i + 1; j < k; j++) {
      if (!num[j]) continue;
      for (int l = num[j]; l <= n; l++) sub(dp[l], dp[l - num[j]]);
      ans[i][j] = ans[j][i] = 2ll * dp[n / 2] % mod;
      for (int l = n; l >= num[j]; l--) add(dp[l], dp[l - num[j]]);
    }
    for (int j = n; j >= num[i]; j--) add(dp[j], dp[j - num[i]]);
  }
  int q;
  scanf("%d", &q);
  while (q--) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--, y--;
    x = id(s[x]), y = id(s[y]);
    printf("%lld\n", umr * ans[x][y] % mod);
  }
  return 0;
}
