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

template<unsigned long long m>
struct modint {

	unsigned long long x;

	modint() : x(0) {}

	modint(long long arg) {
		arg %= m;
		if (arg < 0) {
			x = arg + m;
		} else {
			x = arg;
		}
	}

	

	modint& operator+= (const modint& other) {
		x += other.x;
		if (x >= m) {
			x -= m;
		}
		return *this;
	}

	modint& operator*= (const modint& other) {
		x = (x * other.x) % m;
		return *this;
	}

	modint& operator-= (const modint& other) {
		x += m - other.x;
		if (x >= m) {
			x -= m;
		}
		return *this;
	}

	modint operator+ (const modint& other) const {
		modint tmp = *this;
		tmp += other;
		return tmp;
	}

	modint operator- (const modint& other) const {
		modint tmp = *this;
		tmp -= other;
		return tmp;
	}

	modint operator* (const modint& other) const {
		modint tmp = *this;
		tmp *= other;
		return tmp;
	}

	explicit operator unsigned long long () const {
		return x;
	}

	modint& operator++ () {
		++x;
		if (x == m) {
			x = 0;
		}
		return *this;
	}

	modint& operator-- () {
		if (x == 0) {
			x = m-1;
		} else {
			--x;
		}
		return *this;
	}

	modint operator++ (int) {
		modint tmp = *this;
		++*this;
		return tmp;
	}

	modint operator-- (int) {
		modint tmp = *this;
		--*this;
		return tmp;
	}

	bool operator== (const modint& other) const {
		return x == other.x;
	}

	bool operator!= (const modint& other) const {
		return x != other.x;
	}

	modint operator^ (unsigned long long arg) const {
		if (arg == 0) {
			return 1;
		}
		if (arg == 1) {
			return x;
		}
		auto t = *this ^ (arg >> 1);
		t *= t;
		if (arg & 1) {
			t *= *this;
		}
		return t;
	}

	modint inv(unsigned long long exp = m - 2) const {
		return *this ^ exp;
	}
};

const unsigned long long MOD = 1'000'000'007;
typedef modint<MOD> mint;

mint f[100005];

string s;
int n, q;

int z[26][100005];

int amt[26];

mint resi() {
	int neparni = 0;
	for (int i=0; i<26; i++) {
		if (amt[i] % 2) {
			neparni++;
		}
	}

	if (neparni == 0) {
		mint sol = 1;

		sol = f[accumulate(amt, amt+26, 0) / 2];

		for (int i=0; i<26; i++) {
			sol *= f[amt[i] / 2].inv();
		}

		return sol;
	}

	int sumh = 0;
	for (int i=0; i<26; i++) {
		sumh += amt[i] / 2;
	}

	mint sol = f[sumh];

	for (int i=0; i<26; i++) {
		sol *= f[amt[i] / 2].inv();
	}

	sol *= neparni;

	return sol;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cerr.tie(nullptr);

	cin >> s;
	n = s.size();
	s = string(" ") + s;
	cin >> q;

	for (int i=1; i<=n; i++) {
		for (int j=0; j<26; j++) {
			z[j][i] += z[j][i-1];
		}
		z[s[i] - 'a'][i]++;
	}

	f[0] = 1;
	for (int i=1; i<=100004; i++) {
		f[i] = f[i-1] * i;
	}

	while (q--) {
		int l, r;
		cin >> l >> r;
		for (int i=0; i<26; i++) {
			amt[i] = z[i][r] - z[i][l-1];
		}
		cout << resi().x << '\n';
	}
}