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