#include <vector>
#include <list>
#include <map>
#include <set>
#include "queue"
#include <deque>
#include <stack>
#include <numeric>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <complex>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <climits>
#include <cassert>
#include <iostream>
#include "fstream"
#include  <unordered_set>
#include <unordered_map>
using namespace std;
#define PI acos(-1)
#define pii pair<long long ,long long >
#define ll  long long int
#define loop(i,n) for(int i=0;i<n;i++)
#define loop2(i,n) for(int i = 1;i<=n;i+=1)
ll mod_expo(ll MOD,ll a,ll b){ll ans =1;while (b) {if (b%2) {ans*=a;ans%=MOD;}b/=2;a*=a;a%=MOD;}return ans%MOD;}
#define pb push_back
#define mp make_pair
#define EPS 1e-8
void display(vector<int> v1){loop(i,v1.size()){cout<<v1[i]<<" ";}cout<<endl;}
int dx[8] = {0,1,0,-1,1,1,-1,-1};
int dy[8] = {1,0,-1,0,1,-1,1,-1};
using namespace  std;
//Hala Madrid
string s;
const int MAXN = (int)1e5+1000;
int pref[MAXN][26];
vector<int> query(int L,int R)
{
    vector<int>ans;
    for (int i = 0 ; i<26; i+=1) {
        if(L!=0){
        ans.push_back(pref[R][i]-pref[L-1][i]);
        }
        else{
            ans.push_back(pref[R][i]);
        }
    }
    return ans;
}
ll fact[MAXN];
ll inv_fact[MAXN];
const int MOD  = (int)(1e9+7);
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    fact[0] = 1;
    for (ll i = 1; i<MAXN; i+=1) {
        fact[i] = (fact[i-1]*i)%MOD;
    }
    for (int i = MAXN-1; i>=0; i-=1) {
        inv_fact[i] = mod_expo(MOD, fact[i], MOD-2);
    }
    
        cin>>s;
        for (int i = 0;i<s.length(); i+=1) {
            pref[i][(s[i]-'a')] += 1;
        }
    for (int i = 0 ; i<s.length(); i+=1) {
        if (i==0) {
            continue;
        }
        for (int j  =0 ; j<26; j+=1) {
            pref[i][j]+=pref[i-1][j];
        }
    }
//    for (int i = 0 ; i<s.length(); i+=1) {
//        for (int j = 0 ; j<26; j+=1) {
//            cout<<pref[i][j]<<" ";
//        }
//        cout<<endl;
//    }
    int q;
    cin>>q;
    while (q--) {
        int L,R;
        cin>>L>>R;
        L-=1;
        R-=1;
        vector<int>wooooow = query(L, R);
        
        ll oddavail = 0;
        ll evenavail = 0 ;
        for (int i  =0 ; i<wooooow.size(); i+=1) {
           // cout<<wooooow[i]<<" ";
            evenavail+=(wooooow[i]/2);
            oddavail+=(wooooow[i]%2);
        }
//        cout<<endl;
//        cout<<evenavail<<" "<<" "<<oddavail<<endl;;
        ll ans = fact[evenavail];
        for (int i  = 0; i<26; i+=1) {
            ll evenpairgiven = (wooooow[i]/2);
            ans*=inv_fact[evenpairgiven];
            ans%=MOD;
        }
        if (oddavail) {
            ans*=oddavail;
            ans%=MOD;
        }
        cout<<ans<<endl;
        
    }
    
    
    return 0;
}