#include<bits/stdc++.h>
using namespace std;
#define db(x){if(cond)cerr<<__LINE__<<" "<<#x<<" " <<x<<endl;}
#define rep(i,b)for(auto i=(0);i<(b);++i)
#define fo(i,a,b)for(auto i=(a);i<=(b);++i)
#define ford(i,a,b)for(auto i=(a);i>=(b);--i)
#define all(x) (x).begin(),(x).end()
#define vv vector
#define pb push_back
template<typename X>void MA(X&a,X b){a=max(a,b);}template<typename X>void MI(X&a,X b){a=min(a,b);}
template<typename X>void clr(X&x,int a){memset(x,a,sizeof(a));};typedef long long ll;typedef long double ld;
typedef array<int,2>i2;typedef vv<int>vi;int cond=0,multi=0,gcj=0;

struct solver_t;solver_t *solver;
const int MAXN=(int)1e5;
const int MOD=(int)1e9+7;

struct solver_t{

  ll SILNIA[MAXN+2];
  ll REV_SILNIA[MAXN+2];

  ll pot(ll a,ll b){
    ll x=a%MOD; ll ret=1;
    while(b){
      if(b&1){ret=(ret*x)%MOD;}
      b/=2;x=(x*x)%MOD;
      db(x<<" "<<ret);
    }
    return ret;
  }

  string S;

  int cnt[MAXN+2][32];

  void solve(){
    // init
    SILNIA[0]=1;
    db("");
    fo(i,1,MAXN)SILNIA[i]=(SILNIA[i-1]*i)%MOD;
    db(MOD);
    db("");
    REV_SILNIA[MAXN]=pot(SILNIA[MAXN],MOD-2);
    db("");
    ford(i,MAXN-1,0){
      REV_SILNIA[i]=(REV_SILNIA[i+1]*(i+1))%MOD;
    }
    db("");
    assert((SILNIA[5]*REV_SILNIA[5])%MOD==1);

    // read
    cin>>S;
    int N=S.size();
    S="#"+S;

    fo(i,1,N)cnt[i][S[i]-'a']++;
    fo(i,1,N)rep(j,32)cnt[i][j]+=cnt[i-1][j];

    int Q;cin>>Q;
    rep(i,Q){
      int L,R;cin>>L>>R;
      db(L<<" "<<R);
      int res[32]={};
      rep(j,32)res[j]=cnt[R][j]-cnt[L-1][j];

      int odd=0;
      rep(j,32)if(res[j]%2==1)odd++;
      if(cond){rep(j,32)cerr<<res[j]<<" ";cerr<<endl;}

      int left=0;
      rep(j,32)left+=res[j]/2;
      db(odd<<" "<<left);


      ll answer=odd?odd:1;

      rep(j,32)if(res[j]/2){
        // (left,res[j]/2)
        ll b=res[j]/2;
        answer=(answer*SILNIA[left])%MOD;
        answer=(answer*REV_SILNIA[b])%MOD;
        answer=(answer*REV_SILNIA[left-b])%MOD;

        left-=b;
      }
      cout<<answer<<"\n";
    }
  }
  void gen(){}
  void brute(){}
};

int main(int argc,char** argv){
  fo(i,1,argc-1)if(argv[i]==string("q"))cond=1<<30;
  fo(i,1,argc-1)if(argv[i]==string("gen")){(solver=new solver_t())->gen();exit(0);}
  fo(i,1,argc-1)if(argv[i]==string("brute")){(solver=new solver_t())->brute();exit(0);}
  ios::sync_with_stdio(false),cin.tie(0);
  cout.setf(ios::fixed),cout.precision(10);int t;if(multi||gcj)cin>>t;else t=1;
  fo(i,1,t){if(cond)cerr<<__LINE__<<" "<<i<<endl;if(gcj)cout<<"Case #"<<i<<": ";
    solver = new solver_t();
    solver->solve();
  }return 0;
}