#include <bits/stdc++.h>
using namespace std;
const int s_size = 1e5 + 5;
const int mod = 1e9 + 7;
int f[(s_size + 1) >> 1] = {1}, t[(s_size + 1) >> 1], g[(s_size + 1) >> 1];
int fac[s_size] = {1}, inv[s_size], ans[s_size];
int num(char c);
void fac_inv(void);
int qpow(int a, int b);
int main(void) {
  int q, x, y, cnt[55] = {0}, plan[55][55];
  string s;
  cin >> s >> q;
  s = '0' + s;
  int length = s.size() - 1, upper = (length >> 1);
  for (int i = 1; i <= length; i++) cnt[num(s[i])]++;
  fac_inv();
  int coe = (static_cast<long long>(fac[upper]) * fac[upper]) % mod;
  for (int i = 1; i <= 52; i++)
    if (cnt[i] > 0) {
      coe = (static_cast<long long>(coe) * inv[cnt[i]]) % mod;
      for (int j = upper; j >= cnt[i]; j--) f[j] = (f[j] + f[j - cnt[i]]) % mod;
    }
  for (int i = 1; i <= 52; i++)
    if (cnt[i] > 0) {
      plan[i][i] = f[upper];
      for (int j = 0; j <= upper; j++)
        if (j >= cnt[i])
          t[j] = (static_cast<long long>(f[j]) - t[j - cnt[i]] + mod) % mod;
        else
          t[j] = f[j];
      for (int j = i + 1; j <= 52; j++)
        if (cnt[j] > 0) {
          for (int k = 0; k <= upper; k++) {
            if (k >= cnt[j])
              g[k] = (static_cast<long long>(t[k]) - g[k - cnt[j]] + mod) % mod;
            else
              g[k] = t[k];
            plan[i][j] = (static_cast<long long>(2) * g[upper]) % mod;
            plan[j][i] = plan[i][j];
          }
        }
    }
  for (int i = 1; i <= q; i++) {
    cin >> x >> y;
    ans[i] = (static_cast<long long>(coe) * plan[num(s[x])][num(s[y])]) % mod;
  }
  for (int i = 1; i <= q; i++) cout << ans[i] << endl;
  return 0;
}
inline int num(char c) { return islower(c) ? c - 'a' + 1 : c - 'A' + 27; }
void fac_inv(void) {
  for (int i = 1; i <= s_size - 5; i++)
    fac[i] = (static_cast<long long>(fac[i - 1]) * i) % mod;
  inv[s_size - 5] = qpow(fac[s_size - 5], mod - 2);
  for (int i = s_size - 6; i >= 0; i--)
    inv[i] = (static_cast<long long>(inv[i + 1]) * (i + 1)) % mod;
}
int qpow(int a, int b) {
  int ret = 1;
  while (b > 0) {
    if ((b & 1) == 1) ret = (static_cast<long long>(ret) * a) % mod;
    a = (static_cast<long long>(a) * a) % mod;
    b >>= 1;
  }
  return ret;
}
