#include <bits/stdc++.h>
using namespace std;
unsigned long long power(unsigned long long base, unsigned long long exp) {
  unsigned long long answer = 1;
  while (exp > 1) {
    if (exp & 1L) answer = (answer * base) % 1000000007;
    base = (base * base) % 1000000007;
    exp /= 2;
  }
  return (answer * base) % 1000000007;
}
int main() {
  string s;
  int q;
  unordered_map<char, unsigned long long> count;
  cin >> s >> q;
  for (unsigned long long i = 0; i < s.size(); ++i) {
    if (count.find(s[i]) == count.end())
      count[s[i]] = 1;
    else
      ++count[s[i]];
  }
  int n = s.size();
  vector<unsigned long long> fact(n + 1, 0);
  vector<unsigned long long> invFact(n + 1, 0);
  fact[0] = fact[1] = 1;
  for (unsigned long long i = 2; i <= n; ++i)
    fact[i] = (i * fact[i - 1]) % 1000000007;
  invFact[n] = power(fact[n], 1000000007 - 2);
  for (long long i = n - 1; i >= 0; --i)
    invFact[i] = ((i + 1) * invFact[i + 1]) % 1000000007;
  unsigned long long numValue = ((fact[n / 2] * fact[n / 2]) % 1000000007);
  for (auto it = count.begin(); it != count.end(); ++it)
    numValue = (numValue * invFact[it->second]) % 1000000007;
  vector<unsigned long long> T(n + 1, 0);
  T[0] = 1;
  for (auto col = count.begin(); col != count.end(); ++col)
    for (long long row = n; row > 0; --row) {
      if (col->second <= row)
        T[row] = (T[row] + T[row - col->second]) % 1000000007;
    }
  unordered_map<char, unordered_map<char, unsigned long long>> S;
  for (auto it = count.begin(); it != count.end(); ++it) {
    S[it->first] = unordered_map<char, unsigned long long>();
    vector<long long> temp(T.begin(), T.end());
    for (long long row = 1; row <= n; ++row) {
      if (row >= it->second) temp[row] -= temp[row - it->second];
      if (temp[row] < 0) temp[row] += 1000000007;
    }
    for (auto jt = it; jt != count.end(); ++jt) {
      if (it == jt)
        S[it->first][jt->first] = (numValue * T[n / 2]) % 1000000007;
      else {
        for (unsigned long long row = 1; row <= n; ++row) {
          if (row >= jt->second) temp[row] -= temp[row - jt->second];
          if (temp[row] < 0) temp[row] += 1000000007;
        }
        S[it->first][jt->first] = (2 * numValue * temp[n / 2]) % 1000000007;
        for (long long row = n; row > 0; --row) {
          if (row >= jt->second)
            temp[row] = (temp[row] + temp[row - jt->second]) % 1000000007;
        }
      }
    }
  }
  for (int i = 0; i < q; ++i) {
    unsigned long long a, b;
    cin >> a >> b;
    --a;
    --b;
    if (S.find(s[a]) != S.end() and S[s[a]].find(s[b]) != S[s[a]].end())
      cout << S[s[a]][s[b]] << endl;
    else
      cout << S[s[b]][s[a]] << endl;
  }
  return 0;
}
