#include using namespace std; typedef long long ll; typedef vector vl; typedef vector vvl; typedef pair pll; typedef vector vb; const ll oo = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-9; #define sz(c) ll((c).size()) #define all(c) begin(c), end(c) #define FOR(i,a,b) for (ll i = (a); i < (b); i++) #define FORD(i,a,b) for (ll i = (b)-1; i >= (a); i--) #define mp make_pair #define mt make_tuple #define pb push_back #define eb emplace_back #define xx first #define yy second #define has(c,i) ((c).find(i) != end(c)) #define DBGDO(X) ({ if(1) cerr << "DBGDO: " << (#X) << " = " << (X) << endl; }) const ll MOD = 1e9 + 7, N = 1e5 + 10; ll inv[N], fac[N], invfac[N]; ll b(ll n, ll k) { return fac[n] * invfac[k] % MOD * invfac[n-k] % MOD; } ll f(vl cnt) { ll oddcnt = 0; FOR(i,0,26) if (cnt[i]%2) oddcnt++; ll n = 0; FOR(i,0,26) n += cnt[i]/2; ll mc = fac[n]; FOR(i,0,26) mc = mc * invfac[cnt[i]/2] % MOD; return mc * max(oddcnt,1LL) % MOD; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); inv[1] = 1; FOR(n,2,N) inv[n] = (MOD - inv[MOD%n] * (MOD/n) % MOD) % MOD; fac[0] = 1; FOR(n,1,N) fac[n] = n*fac[n-1] % MOD; invfac[0] = 1; FOR(n,1,N) invfac[n] = inv[n] * invfac[n-1] % MOD; string s; cin >> s; ll n = sz(s); vvl cnt(26,vl(n+1)); FOR(j,0,n) { FOR(i,0,26) cnt[i][j+1] = cnt[i][j]; cnt[s[j]-'a'][j+1]++; } ll q; cin >> q; while (q--) { ll l, r; cin >> l >> r; l--; vl cur(26); FOR(i,0,26) cur[i] = cnt[i][r]-cnt[i][l]; cout << f(cur) << endl; } }