#include using namespace std; typedef long long ll; ll MOD = 1000000007; ll fact[100100], invfact[100100]; ll data[100100][30]; int inverse(int a, int m) { //returns a pair where first one if the inverse of a modulo m and second one is gcd; //if gcd != 1, then it gives x such that a*x = gcd(mod m) long alpha = a; long beta = m; long fa = 1, fb = 0, sa = 0, sb = 1; while(alpha % beta != 0) { long quotient = alpha / beta; long remainder = alpha % beta; long tempa = sa; long tempb = sb; sa = fa - quotient*sa; sb = fb - quotient*sb; fa = tempa; fb = tempb; alpha = beta; beta = remainder; } return (m + (sa % m) ) %m; } void initialize(string s) { memset(data, 0, sizeof data); data[1][s[0]-97]++; for(ll i = 1; i < s.size(); i++) { for(ll j = 0; j < 26; j++) data[i+1][j] = data[i][j]; data[i+1][s[i]-97]++; } // This function is called once before all queries. fact[0] = invfact[0] = 1; for(ll i = 1; i < 100100; i++) { fact[i] = (fact[i-1]*i)%MOD; invfact[i] = (invfact[i-1]*inverse(i ,MOD))%MOD; } } ll answerQuery(ll l, ll r) { // Return the answer for this query modulo 1000000007. ll arrans[26]; ll res = 0; ll ans = 1; ll count = 0; for(ll i = 0; i < 26; i++) { arrans[i] = data[r][i] - data[l-1][i]; if (arrans[i]%2) res++; ll temp = arrans[i]/2; ans = (ans*invfact[temp])%MOD; count += temp; } ans = (ans*fact[count])%MOD; if (res > 1) ans = (ans * res)%MOD; return ans; } int main() { string s; cin >> s; initialize(s); ll q; cin >> q; for(ll a0 = 0; a0 < q; a0++){ ll l; ll r; cin >> l >> r; ll result = answerQuery(l, r); cout << result << endl; } return 0; }