#include <bits/stdc++.h>
#pragma GCC optimize(3, "Ofast", "inline")
void err() { std::cout << std::endl; }
template <typename T, typename... Args>
void err(T a, Args... args) {
  std::cout << a << ' ';
  err(args...);
}
using namespace std;
bool Finish_read;
template <class T>
inline void read(T &x) {
  Finish_read = 0;
  x = 0;
  int f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    if (ch == EOF) return;
    ch = getchar();
  }
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  x *= f;
  Finish_read = 1;
}
template <class T>
inline void print(T x) {
  if (x / 10 != 0) print(x / 10);
  putchar(x % 10 + '0');
}
template <class T>
inline void writeln(T x) {
  if (x < 0) putchar('-');
  x = abs(x);
  print(x);
  putchar('\n');
}
template <class T>
inline void write(T x) {
  if (x < 0) putchar('-');
  x = abs(x);
  print(x);
}
mt19937 rng_32(chrono::steady_clock::now().time_since_epoch().count());
const int mod = 1e9 + 7;
const int seed = 233;
const double PI = acos(-1.0);
const int inf = 0x3f3f3f3f;
const int max_n = 100005;
namespace {
inline int Add(int x, int y) { return (x += y) >= mod ? x - mod : x; }
inline int Sub(int x, int y) { return (x -= y) < 0 ? x + mod : x; }
inline int Mul(int x, int y) { return 1ll * x * y % mod; }
inline int Pow(int x, int y = mod - 2) {
  int res = 1;
  while (y) {
    if (y & 1) res = 1ll * res * x % mod;
    x = 1ll * x * x % mod;
    y >>= 1;
  }
  return res;
}
}  // namespace
char s[max_n];
int q;
int f[max_n];
int inv[max_n];
int id[200];
int cnt[52];
int dp[max_n];
int ans[52][52];
int dpn[max_n];
int main() {
  scanf(" %s", s + 1);
  int n = strlen(s + 1);
  f[0] = 1;
  for (int i = 1; i <= n; i++) f[i] = Mul(f[i - 1], i);
  inv[n] = Pow(f[n]);
  for (int i = n - 1; i >= 1; i--) inv[i] = Mul(inv[i + 1], i + 1);
  for (int i = 0; i < 26; i++) id['a' + i] = i, id['A' + i] = i + 26;
  for (int i = 1; i <= n; i++) cnt[id[s[i]]]++;
  int res = Mul(f[n / 2], f[n / 2]);
  for (int i = 0; i < 52; i++)
    if (cnt[i]) res = Mul(res, inv[cnt[i]]);
  dp[0] = 1;
  for (int i = 0; i < 52; i++) {
    if (cnt[i] == 0) continue;
    for (int j = n; j >= cnt[i]; j--) dp[j] = Add(dp[j], dp[j - cnt[i]]);
  }
  for (int i = 0; i < 52; i++) ans[i][i] = dp[n / 2];
  for (int i = 0; i < 52; i++) {
    if (cnt[i] == 0) continue;
    for (int j = 0; j <= n; j++) dpn[j] = dp[j];
    for (int j = cnt[i]; j <= n; j++) dpn[j] = Sub(dpn[j], dpn[j - cnt[i]]);
    for (int j = i + 1; j < 52; j++) {
      if (cnt[j] == 0) continue;
      for (int w = cnt[j]; w <= n; w++) dpn[w] = Sub(dpn[w], dpn[w - cnt[j]]);
      ans[i][j] = ans[j][i] = Mul(dpn[n / 2], 2);
      for (int w = n; w >= cnt[j]; w--) dpn[w] = Add(dpn[w], dpn[w - cnt[j]]);
    }
  }
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    l = id[s[l]], r = id[s[r]];
    printf("%d\n", Mul(res, ans[l][r]));
  }
  return 0;
}
