/*input
week
2
1 4
2 3
*/
#include <bits/stdc++.h>

using namespace std;

struct Uzklausa {
	int l, r, i;
};

const long long mod = 1000000007;

long long power(long long x, long long y)
{
	if (y == 0)
		return 1;

	long long p = power(x, y / 2) % mod;
	p = (p * p) % mod;

	return (y % 2 == 0) ? p : (x * p) % mod;
}

long long modInverse(long long a)
{
	return power(a, mod - 2);
}

// To compute x^y under modulo m



int main () {
	string s;
	cin >> s;
	int q;
	cin >> q;
	Uzklausa uzk[q];

	long long fakt[100005];
	long long faktinv[100005];
	fakt[0] = 1;
	faktinv[0] = 1;

	for (int i = 1; i < 100005; i++) {
		fakt[i] = (fakt[i - 1] * i) % mod;
		faktinv[i] = modInverse(fakt[i]);
	}

	for (int i = 0; i < q; i++) {
		cin >> uzk[i].l >> uzk[i].r;
		uzk[i].i = i;
		uzk[i].l--;
	}

	const int SAK = 320;

	sort(uzk, uzk + q, [](const auto & i, const auto & j) -> bool {
		if (i.l / SAK == j.l / SAK)
			return i.r < j.r;
		return i.l < j.l;
	});

	int pr = 0, pa = 0;

	int kie[27] = {};

	long long ats[q] = {};

	for (auto && x : uzk) {
		//cout << x.l << " " << x.r << endl;

		while (pa < x.r)
			kie[s[pa++] - 'a']++;

		while (x.l < pr)
			kie[s[--pr] - 'a']++;

		while (pa > x.r)
			kie[s[--pa] - 'a']--;

		while (x.l > pr)
			kie[s[pr++] - 'a']--;

		long long did = 0, vien = 0;

		for (int i = 0; i < 27; i++) {
			did += kie[i] / 2;
			vien += kie[i] % 2;
			//cout << kie[i] << " ";
		}

		if (vien == 0)
			vien = 1;

		ats[x.i] = (fakt[did] * vien) % mod;

		for (int i = 0; i < 27; i++) {
			ats[x.i] *= faktinv[kie[i] / 2];
			ats[x.i] %= mod;
		}

	}

	for (int i = 0; i < q; i++)
		cout << ats[i] << "\n";

	return 0;
}