#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <utility>
#include <cstdlib>
#include <memory>
#include <queue>
#include <cassert>
#include <cmath>
#include <ctime>
#include <complex>
#include <bitset>
#include <fstream>
#include <unordered_map>
#include <unordered_set>
#include <numeric>

using namespace std;

#define ws ws_____________________
#define y1 y1_____________________
#define y0 y0_____________________
#define left left_________________
#define right right_______________
#define next next_________________
#define prev prev_________________
#define hash hash_________________

#define pb push_back
#define fst first
#define snd second
#define mp make_pair 
#define sz(C) ((int) (C).size())
#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
#define all(C) begin(C), end(C)

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vii;
typedef long double ld;
typedef complex<double> cd;

#ifdef LOCAL
#define eprintf(args...) fprintf(stderr, args), fflush(stderr)
#else
#define eprintf(...) ;
#endif

#define FILE_NAME "a"

const int MOD = 1e9 + 7;

void add(int& x, int y) {
	((x += y) >= MOD) && (x -= MOD);
}

int mul(int x, int y) {
	return x * 1ll * y % MOD;
}

int mpow(int a, int p) {
	int res = 1;
	for (; p > 0; p >>= 1, a = mul(a, a)) {
		if  (p & 1) {
			res = mul(res, a);
		}
	}
	return res;
}

int inv(int x) {
	int y = mpow(x, MOD - 2);
	assert(mul(x, y) == 1);
	return y;
}

string s;

bool read() {
	if  (!getline(cin, s)) {
		return 0;
	}
	return 1;
}

const int A = 26;
const int MAXN = 2e5 + 10;

vvi pref;
int fact[MAXN];
int inv_fact[MAXN];

void precalc() {
	pref.assign(A, vi(sz(s) + 1, 0));
	forn(i, sz(s)) {
		forn(c, A) {
			pref[c][i + 1] = pref[c][i];
		}
		++pref[s[i] - 'a'][i + 1];
	}

	fact[0] = 1;
	for (int i = 1; i < MAXN; ++i) {
		fact[i] = mul(fact[i - 1], i);
	}

	forn(i, MAXN) {
		inv_fact[i] = inv(fact[i]);
	}
}	

int binom(int n, int k) {
	return mul(fact[n], mul(inv_fact[n - k], inv_fact[k]));
}

int get_cnt(int l, int r, int c) {
	return pref[c][r + 1] - pref[c][l];
}

int calc_half(const vi& cnt) {
	int ans = 1;
	int have = 0;
	forn(c, A) {
		ans = mul(ans, binom(have + cnt[c], cnt[c]));
		have += cnt[c];
	}
	return ans;
}

int solve(int l, int r) {
	vi cnt(A);
	forn(c, A) {
		cnt[c] = get_cnt(l, r, c);
	}

	int cnt_odd = 0;
	forn(c, A) {
		cnt_odd += cnt[c] & 1;
	}

	forn(c, A) {
		cnt[c] /= 2;
	}

	return mul(calc_half(cnt), max(1, cnt_odd));
}

void solve() {
	precalc();

	int q;
	scanf("%d", &q);
	forn(it, q) {
		int l, r;
		scanf("%d%d", &l, &r);
		--l;
		--r;
		printf("%d\n", solve(l, r));
	}
}

int main() {
#ifdef LOCAL
	freopen(FILE_NAME ".in", "r", stdin);
	// freopen(FILE_NAME ".out", "w", stdout);
#endif

	while (read()) {
		solve();
	}

#ifdef LOCAL
	eprintf("Time: %.10f\n", (double) clock() / CLOCKS_PER_SEC);
#endif
	return 0;
}