#include using namespace std; template struct modint { unsigned long long x; modint() : x(0) {} modint(long long arg) { arg %= m; if (arg < 0) { x = arg + m; } else { x = arg; } } modint& operator+= (const modint& other) { x += other.x; if (x >= m) { x -= m; } return *this; } modint& operator*= (const modint& other) { x = (x * other.x) % m; return *this; } modint& operator-= (const modint& other) { x += m - other.x; if (x >= m) { x -= m; } return *this; } modint operator+ (const modint& other) const { modint tmp = *this; tmp += other; return tmp; } modint operator- (const modint& other) const { modint tmp = *this; tmp -= other; return tmp; } modint operator* (const modint& other) const { modint tmp = *this; tmp *= other; return tmp; } explicit operator unsigned long long () const { return x; } modint& operator++ () { ++x; if (x == m) { x = 0; } return *this; } modint& operator-- () { if (x == 0) { x = m-1; } else { --x; } return *this; } modint operator++ (int) { modint tmp = *this; ++*this; return tmp; } modint operator-- (int) { modint tmp = *this; --*this; return tmp; } bool operator== (const modint& other) const { return x == other.x; } bool operator!= (const modint& other) const { return x != other.x; } modint operator^ (unsigned long long arg) const { if (arg == 0) { return 1; } if (arg == 1) { return x; } auto t = *this ^ (arg >> 1); t *= t; if (arg & 1) { t *= *this; } return t; } modint inv(unsigned long long exp = m - 2) const { return *this ^ exp; } }; const unsigned long long MOD = 1'000'000'007; typedef modint mint; mint f[100005]; string s; int n, q; int z[26][100005]; int amt[26]; mint resi() { int neparni = 0; for (int i=0; i<26; i++) { if (amt[i] % 2) { neparni++; } } if (neparni == 0) { mint sol = 1; sol = f[accumulate(amt, amt+26, 0) / 2]; for (int i=0; i<26; i++) { sol *= f[amt[i] / 2].inv(); } return sol; } int sumh = 0; for (int i=0; i<26; i++) { sumh += amt[i] / 2; } mint sol = f[sumh]; for (int i=0; i<26; i++) { sol *= f[amt[i] / 2].inv(); } sol *= neparni; return sol; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cerr.tie(nullptr); cin >> s; n = s.size(); s = string(" ") + s; cin >> q; for (int i=1; i<=n; i++) { for (int j=0; j<26; j++) { z[j][i] += z[j][i-1]; } z[s[i] - 'a'][i]++; } f[0] = 1; for (int i=1; i<=100004; i++) { f[i] = f[i-1] * i; } while (q--) { int l, r; cin >> l >> r; for (int i=0; i<26; i++) { amt[i] = z[i][r] - z[i][l-1]; } cout << resi().x << '\n'; } }