#include using namespace std; using ll = long long; using ull = unsigned long long; using pii = pair; template class modulo { using ll = long long; public: modulo() : n(0) {} modulo(int m) : n(m) { if(n >= M) { n %= M; } else if(n < 0) { n = (n % M + M) % M; } } modulo(ll m) { if(m >= M) { m %= M; } else if(m < 0) { m = (m % M + M) % M; } n = m; } explicit operator int() const { return n; } explicit operator ll() const { return n; } bool operator==(modulo const& a) const { return n == a.n; } modulo& operator+=(modulo const& a) { n += a.n; if(n >= M) { n -= M; } return *this; } modulo& operator-=(modulo const& a) { n -= a.n; if(n < 0) { n += M; } return *this; } modulo& operator*=(modulo const& a) { n = (ll(n) * a.n) % M; return *this; } modulo operator^(int n) const { if(n == 0) { return modulo(1); } const modulo a = *this; modulo res = (a * a) ^ (n / 2); return n % 2 ? res * a : res; } // for C++11, enable_if_t -> typename enable_if::type typename std::enable_if::type operator/(modulo const& a) const { return *this * modulo(inv(ll(a), M)); } private: ll n; static typename std::enable_if::type inv(ll a, ll p) { return (a == 1 ? 1 : (1 - p*inv(p%a, a))/a + p); } }; template modulo operator+(modulo lhs, modulo const& rhs) { lhs += rhs; return lhs; } template modulo operator-(modulo lhs, modulo const& rhs) { lhs -= rhs; return lhs; } template modulo operator*(modulo lhs, modulo const& rhs) { lhs *= rhs; return lhs; } // sw == false -> inv template modulo fact(int n, bool sw = true) { static std::vector> v1 = {1}, v2 = {1}; if(n >= (int)v1.size()) { const int from = v1.size(), to = n + 1024; v1.reserve(to); v2.reserve(to); for(int i=from; i(i)); v2.push_back(v2.back() / modulo(i)); } } return sw ? v1[n] : v2[n]; } template modulo comb(int a, int b) { if(b < 0 || b > a) { return fact(0); } return fact(a, true) * fact(b, false) * fact(a-b, false); } const int MOD = 1000000007; using mod = modulo; int main() { string s; cin >> s; int n = s.size(); vector> sum(n + 1, vector(26)); for(int i = 0; i < s.size(); ++i) { sum[i + 1][s[i] - 'a'] += 1; for(int j = 0; j < 26; ++j) { sum[i + 1][j] += sum[i][j]; } } int q; cin >> q; while(q--) { int l, r; cin >> l >> r; vector cnt(26); int len = 0; ll odd = 0; for(int i = 0; i < 26; ++i) { cnt[i] = (sum[r][i] - sum[l - 1][i]) / 2; len += cnt[i]; odd += (sum[r][i] - sum[l - 1][i]) & 1; } mod ans = 1; for(int i = 0; i < 26; ++i) { ans *= comb(len, cnt[i]); len -= cnt[i]; } ans *= max(odd, 1LL); cout << (ll)ans << endl; } }