#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef pair<ll,ll> pll;
typedef vector<bool> 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;
	}
}