#include using namespace std; const int ALPHA = 30; const int MAXN = 1e5 + 5; const int MOD = 1e9 + 7; inline int mul_mod(int a, int b) { return a * 1LL * b % MOD; } int mpow(int a, int b) { int res = 1; while (b > 0) { if (b & 1) res = mul_mod(res, a); a = mul_mod(a, a); b >>= 1; } return res; } int cnt[MAXN][ALPHA], fact[MAXN]; char str[MAXN]; int main() { fact[0] = 1; for (int i = 1; i < MAXN; i++) fact[i] = mul_mod(fact[i - 1], i); scanf("%s", str + 1); int n = strlen(str + 1), q; for (int i = 1; i <= n; i++) { for (int j = 0; j < ALPHA; j++) cnt[i][j] = cnt[i - 1][j]; cnt[i][(int)str[i] - 'a']++; } scanf("%d", &q); while (q--) { int l, r; scanf("%d %d", &l, &r); int odd_cnt = 0; int div_with = 1, total = 0; for (int j = 0; j < ALPHA; j++) { int how_much = (cnt[r][j] - cnt[l - 1][j]); if (how_much & 1) odd_cnt++; if (how_much / 2 > 0) { div_with = mul_mod(div_with, fact[how_much / 2]); total += how_much / 2; } } printf("%d\n", mul_mod(mul_mod(fact[total], mpow(div_with, MOD - 2)), odd_cnt > 0 ? odd_cnt : 1)); } return 0; }