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