#include <bits/stdc++.h>
using namespace std;
const int maxn = 100002;
const int maxc = 53;
const int lbt = 1e9 + 7;
char str[maxn];
int a[maxn];
int uni[maxn];
int cnt[maxn];
int dp[maxn];
int ans[maxc][maxc];
int fac[maxn];
int rfac[maxn];
int n, q;
int rev(int a);
int main() {
  scanf("%s", str + 1);
  fac[0] = rfac[0] = 1;
  for (int i = 1; i < maxn; i++) {
    fac[i] = (long long)fac[i - 1] * i % lbt;
    rfac[i] = rev(fac[i]);
  }
  n = strlen(str + 1);
  for (int i = 1; i <= n; i++) {
    uni[i] = a[i] = str[i];
  }
  sort(uni + 1, uni + 1 + n);
  int *end = unique(uni + 1, uni + 1 + n);
  int mac = end - uni - 1;
  for (int i = 1; i <= n; i++) {
    a[i] = lower_bound(uni + 1, end, a[i]) - uni;
    cnt[a[i]]++;
  }
  int w = (long long)fac[n / 2] * fac[n / 2] % lbt;
  for (int i = 1; i <= mac; i++) {
    w = (long long)w * rfac[cnt[i]] % lbt;
  }
  for (int x = 1; x <= mac; x++) {
    memset(dp, 0, sizeof(dp));
    dp[cnt[x]] = 1;
    int sum = cnt[x];
    swap(cnt[x], cnt[1]);
    for (int i = 2; i <= mac; i++) {
      sum += cnt[i];
      for (int j = sum; j >= cnt[i]; j--) {
        dp[j] = (dp[j] + dp[j - cnt[i]]) % lbt;
      }
    }
    ans[x][x] = (long long)2 * w * dp[n / 2] % lbt;
    for (int y = 2; y <= mac; y++) {
      for (int j = cnt[y]; j <= sum; j++) {
        dp[j] = (dp[j] + lbt - dp[j - cnt[y]]) % lbt;
      }
      if (n / 2 >= cnt[y])
        ans[x][y == x ? 1 : y] = (long long)2 * w * dp[n / 2 - cnt[y]] % lbt;
      for (int j = sum; j >= cnt[y]; j--) {
        dp[j] = (dp[j] + dp[j - cnt[y]]) % lbt;
      }
    }
    swap(cnt[x], cnt[1]);
  }
  scanf("%d", &q);
  while (q--) {
    int x, y;
    scanf("%d%d", &x, &y);
    printf("%d\n", ans[a[x]][a[y]]);
  }
  return 0;
}
int d, x, y;
void gcd(int a, int b) {
  if (!b) {
    d = a;
    x = 1;
    y = 0;
    return;
  }
  gcd(b, a % b);
  int t = x;
  x = y;
  y = t - a / b * y;
}
int rev(int a) {
  gcd(a, lbt);
  if (x < 0) x += lbt;
  return x;
}
