#include 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; }