#include <bits/stdc++.h>
using namespace std;
namespace FGF {
int n, m;
int read() {
  int s = 0, w = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') w = -w;
    ch = getchar();
  }
  while (isdigit(ch)) {
    s = s * 10 + ch - '0';
    ch = getchar();
  }
  return s * w;
}
const int N = 1e5 + 5;
const int mo = 1e9 + 7;
char s[N];
int num[60];
inline int getnum(char c) { return c >= 'a' ? c - 'a' + 1 : c - 'A' + 27; }
long long f[N], fac[N], inv[N], g[N], h[N], ans[60][60];
void init() {
  fac[0] = inv[0] = inv[1] = 1;
  for (int i = 1; i <= n / 2; i++) fac[i] = fac[i - 1] * i % mo;
  for (int i = 2; i <= n / 2; i++) inv[i] = inv[mo % i] * (mo - mo / i) % mo;
  for (int i = 2; i <= n / 2; i++) inv[i] = inv[i - 1] * inv[i] % mo;
}
void work() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i <= n; i++) num[getnum(s[i])]++;
  init();
  f[0] = 1;
  for (int i = 1; i <= 52; i++)
    for (int j = n / 2; j >= num[i]; j--)
      if (num[i]) f[j] = (f[j] + f[j - num[i]]) % mo;
  for (int i = 1; i <= 52; i++)
    if (num[i]) {
      ans[i][i] = f[n / 2];
      for (int j = 0; j <= n / 2; j++)
        if (j >= num[i])
          g[j] = (f[j] - g[j - num[i]] + mo) % mo;
        else
          g[j] = f[j];
      for (int j = i + 1; j <= 52; j++)
        if (num[j]) {
          for (int k = 0; k <= n / 2; k++)
            if (k >= num[j])
              h[k] = (g[k] - h[k - num[j]] + mo) % mo;
            else
              h[k] = g[k];
          ans[j][i] = ans[i][j] = h[n / 2] * 2 % mo;
        }
    }
  long long res = fac[n / 2] * fac[n / 2] % mo;
  for (int i = 1; i <= 52; i++) res = res * inv[num[i]] % mo;
  m = read();
  while (m--) {
    int x = read(), y = read();
    printf("%lld\n", res * ans[getnum(s[x])][getnum(s[y])] % mo);
  }
}
}  // namespace FGF
int main() {
  FGF::work();
  return 0;
}
