/* */ //#pragma GCC optimize("O3") #define _CRT_SECURE_NO_WARNINGS #include <fstream> #include <iostream> #include <string> #include <complex> #include <math.h> #include <set> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <stack> #include <algorithm> #include <list> #include <ctime> #include <memory.h> #include <assert.h> #define y0 sdkfaslhagaklsldk #define y1 aasdfasdfasdf #define yn askfhwqriuperikldjk #define j1 assdgsdgasghsf #define tm sdfjahlfasfh #define lr asgasgash #define norm asdfasdgasdgsd #define have adsgagshdshfhds #define ends asdgahhfdsfshdshfd #define eps 1e-8 #define M_PI 3.141592653589793 #define bsize 512 #define ldouble long double using namespace std; #define bs 1000000007 const int N = 600031; string st; int S[N][30]; long long fact[N],invf[N]; long long pw(long long a,long long b){ if (b==0) return 1; if (b%2) return a*pw(a,b-1)%bs; return pw(a*a%bs,b/2); } long long inv(long long x){ return pw(x,bs-2); } int tests; vector<int> V; long long C(long long n,long long m){ long long res=fact[n]*invf[m]; res%=bs; return res*invf[n-m]%bs; } int solver(vector<int> v){ /*for (int i=0;i<v.size();i++){ cout<<v[i]<<" "; } cout<<endl; */ int max_len=0; int cnt_odd=0; for (int i=0;i<v.size();i++){ max_len+=v[i]/2; cnt_odd+=v[i]%2; } long long res=1; // max_len/=2; for (int i=0;i<v.size();i++){ res=res*C(max_len,v[i]/2); max_len-=v[i]/2; res%=bs; // cout<<res<<" "<<max_len<<" "<<v[i]/2<<endl; } if (cnt_odd>0) res=(res*cnt_odd)%bs; return res; } int main(){ // freopen("apache.in","r",stdin); // freopen("apache.out","w",stdout); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); ios_base::sync_with_stdio(0); // cin.tie(0); cin>>st; cin>>tests; for (int i=1;i<=st.size();i++){ for (int j=0;j<26;j++){ S[i][j]=S[i-1][j]; if (st[i-1]=='a'+j) S[i][j]++; } } fact[0]=1; for (int i=1;i<N;i++){ fact[i]=fact[i-1]*i%bs; } invf[N-1]=inv(fact[N-1]); for (int i=N-2;i>=0;--i){ invf[i]=invf[i+1]*(i+1); invf[i]%=bs; } for (;tests;--tests){ int l,r; cin>>l>>r; V.clear(); for (int i=0;i<26;i++){ V.push_back(S[r][i]-S[l-1][i]); } long long res=solver(V); cout<<res<<endl; } cin.get(); cin.get(); return 0; }