#include <bits/stdc++.h>

using namespace std;

typedef long long int LLI;

const int mod = 1e9+7;
string s;
int cnt[111111][26];
LLI fact[111111], rev[111111], inv[111111];

void initialize(string s) {
    fact[0] = rev[0] = inv[0] = 1;
    fact[1] = rev[1] = inv[1] = 1;
    for (int i = 2; i <= 1e5; ++i) {
        fact[i] = (fact[i-1]*i) % mod;
        rev[i] = (mod - (mod/i) * rev[mod % i] % mod) % mod;
        inv[i] = inv[i-1] * rev[i] % mod;
    }
    // This function is called once before all queries.
    cnt[0][s[0]-'a'] = 1;
    for (int i = 1; i < s.length(); ++i) {
        cnt[i][s[i]-'a'] = 1;
        for (int j = 0; j < 26; ++j)
            cnt[i][j] += cnt[i-1][j];
    }
}

int answerQuery(int l, int r) {
    // Return the answer for this query modulo 1000000007.
    int tmp, num = 0, sum = 0;
    LLI res = 1;
    for (int i = 0; i < 26; ++i) {
        tmp = cnt[r][i] - cnt[l][i];
        if (s[l] == i+'a') ++tmp;
        if (tmp >= 2) {
            if (tmp & 1) {
                ++num;
                --tmp;
            }
            tmp >>= 1;
            sum += tmp;
            res = (res * inv[tmp]) % mod;
        } else if (tmp) ++num;
    }
    res = (res * fact[sum]) % mod;
    res = (res * max(num, 1)) % mod;
    return res;
}

int main() {
    cin >> s;
    initialize(s);
    int q;
    cin >> q;
    for(int a0 = 0; a0 < q; a0++){
        int l;
        int r;
        cin >> l >> r;
        int result = answerQuery(l-1, r-1);
        cout << result << endl;
    }
    return 0;
}