#include <bits/stdc++.h>
using namespace std;
inline int rei() {
  int x;
  cin >> x;
  return x;
}
inline long long rel() {
  long long x;
  cin >> x;
  return x;
}
inline string res() {
  string x;
  cin >> x;
  return x;
}
struct Fact {
  vector<long long> f;
  vector<long long> rf;
  long long pow(long long N, long long K) {
    if (K == 0) {
      return 1;
    } else if (K % 2 == 0) {
      long long t = pow(N, K / 2);
      return t * t % 1000000007;
    } else {
      return N * pow(N, K - 1) % 1000000007;
    }
  }
  Fact(int N) : f(N + 1), rf(N + 1) {
    for (int i = 0; i < N + 1; i++) {
      if (i == 0) {
        f[i] = 1;
      } else {
        f[i] = (f[i - 1] * i) % 1000000007;
      }
    }
    for (int i = N; i >= 0; i--) {
      if (i == N) {
        rf[i] = pow(f[N], 1000000007 - 2);
      } else {
        rf[i] = rf[i + 1] * (i + 1) % 1000000007;
      }
    }
  }
  long long GetFact(int N) { return f[N]; }
  long long GetPerm(int N, int R) { return f[N] * rf[N - R] % 1000000007; }
  long long GetConv(int N, int R) {
    return ((f[N] * rf[R]) % 1000000007 * rf[N - R]) % 1000000007;
  }
  long long GetRev(int N) {
    if (N == 0) {
      return 1;
    } else {
      return rf[N] * f[N - 1] % 1000000007;
    }
  }
};
int C[52];
int chartoint(char c) {
  if ('a' <= c && c <= 'z') {
    return c - 'a';
  } else {
    return c - 'A' + 26;
  }
}
long long DP[100001];
int N;
void Plus(int X) {
  if (X == 0) {
    return;
  }
  for (int i = N / 2; i >= X; i--) {
    DP[i] += DP[i - X];
    DP[i] %= 1000000007;
  }
}
void Minus(int X) {
  if (X == 0) {
    return;
  }
  for (int i = X; i <= N / 2; i++) {
    DP[i] += 1000000007 - DP[i - X];
    DP[i] %= 1000000007;
  }
}
long long ans[52][52];
void Calc() {
  string S = res();
  N = S.length();
  Fact F(N);
  for (int i = 0; i < N; i++) {
    C[chartoint(S[i])]++;
  }
  long long rev = 1;
  for (int i = 0; i < 52; i++) {
    rev *= F.rf[C[i]];
    rev %= 1000000007;
  }
  DP[0] = 1;
  for (int i = 0; i < 52; i++) {
    Plus(C[i]);
  }
  long long all = DP[N / 2] * F.GetFact(N / 2) % 1000000007 * F.GetFact(N / 2) %
                  1000000007 * rev % 1000000007;
  for (int i = 0; i < 52; i++) {
    ans[i][i] = all;
  }
  for (int i = 1; i < 52; i++) {
    Minus(C[i]);
    for (int j = 0; j < i; j++) {
      Minus(C[j]);
      long long c = DP[N / 2] * F.GetFact(N / 2) % 1000000007 *
                    F.GetFact(N / 2) % 1000000007 * 2 * rev % 1000000007;
      ans[i][j] = c;
      ans[j][i] = c;
      Plus(C[j]);
    }
    Plus(C[i]);
  }
  int Q = rei();
  for (int query = 0; query < Q; query++) {
    int x0 = rei() - 1;
    int y0 = rei() - 1;
    int x = chartoint(S[x0]);
    int y = chartoint(S[y0]);
    cout << ans[x][y] << endl;
  }
}
int main(int argc, char** argv) {
  ios::sync_with_stdio(false), cin.tie(0);
  cout.tie(0);
  Calc();
  return 0;
}
