#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ws ws_____________________ #define y1 y1_____________________ #define y0 y0_____________________ #define left left_________________ #define right right_______________ #define next next_________________ #define prev prev_________________ #define hash hash_________________ #define pb push_back #define fst first #define snd second #define mp make_pair #define sz(C) ((int) (C).size()) #define forn(i, n) for (int i = 0; i < int(n); ++i) #define ford(i, n) for (int i = int(n) - 1; i >= 0; --i) #define all(C) begin(C), end(C) typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; typedef pair pii; typedef pair pll; typedef vector vll; typedef vector vi; typedef vector vvi; typedef vector vii; typedef long double ld; typedef complex cd; #ifdef LOCAL #define eprintf(args...) fprintf(stderr, args), fflush(stderr) #else #define eprintf(...) ; #endif #define FILE_NAME "a" const int MOD = 1e9 + 7; void add(int& x, int y) { ((x += y) >= MOD) && (x -= MOD); } int mul(int x, int y) { return x * 1ll * y % MOD; } int mpow(int a, int p) { int res = 1; for (; p > 0; p >>= 1, a = mul(a, a)) { if (p & 1) { res = mul(res, a); } } return res; } int inv(int x) { int y = mpow(x, MOD - 2); assert(mul(x, y) == 1); return y; } string s; bool read() { if (!getline(cin, s)) { return 0; } return 1; } const int A = 26; const int MAXN = 2e5 + 10; vvi pref; int fact[MAXN]; int inv_fact[MAXN]; void precalc() { pref.assign(A, vi(sz(s) + 1, 0)); forn(i, sz(s)) { forn(c, A) { pref[c][i + 1] = pref[c][i]; } ++pref[s[i] - 'a'][i + 1]; } fact[0] = 1; for (int i = 1; i < MAXN; ++i) { fact[i] = mul(fact[i - 1], i); } forn(i, MAXN) { inv_fact[i] = inv(fact[i]); } } int binom(int n, int k) { return mul(fact[n], mul(inv_fact[n - k], inv_fact[k])); } int get_cnt(int l, int r, int c) { return pref[c][r + 1] - pref[c][l]; } int calc_half(const vi& cnt) { int ans = 1; int have = 0; forn(c, A) { ans = mul(ans, binom(have + cnt[c], cnt[c])); have += cnt[c]; } return ans; } int solve(int l, int r) { vi cnt(A); forn(c, A) { cnt[c] = get_cnt(l, r, c); } int cnt_odd = 0; forn(c, A) { cnt_odd += cnt[c] & 1; } forn(c, A) { cnt[c] /= 2; } return mul(calc_half(cnt), max(1, cnt_odd)); } void solve() { precalc(); int q; scanf("%d", &q); forn(it, q) { int l, r; scanf("%d%d", &l, &r); --l; --r; printf("%d\n", solve(l, r)); } } int main() { #ifdef LOCAL freopen(FILE_NAME ".in", "r", stdin); // freopen(FILE_NAME ".out", "w", stdout); #endif while (read()) { solve(); } #ifdef LOCAL eprintf("Time: %.10f\n", (double) clock() / CLOCKS_PER_SEC); #endif return 0; }