#include<bits/stdc++.h> using namespace std; //using namespace __gnu_pbds; typedef long long int ll; typedef long double ld; typedef pair<ll,ll> ii; typedef vector< ii > vii; typedef vector<ll> vi; typedef vector< vi > vvi; //typedef tree<ii,null_type,less<ii>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; #define mm 1000005 #define nn 5005 #define xx real() #define yy imag() #define mod 1000000007 #define pb push_back #define mp make_pair #define ff first #define ss second #define sz(a) (ll)(a.size()) #define all(a) a.begin(),a.end() #define forn(i, n) for(ll i = 0; i < ll(n); ++i) #define rep(i, a, b) for(ll i = ll(a); i <= ll(b); ++i) #define cases ll t; cin>>t; while(t--) #define chck(a,n) forn(iiii,ll(n)) cout<<ll(a[iiii])<<" "; cout<<endl #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL) int cnt[mm][30]; ll po[mm],inpo[mm]; ll power(ll n,ll m) { n%=mod; ll ans=1; while(m) { if(m&1) ans=(ans%mod*n)%mod; n=(n%mod*n)%mod; m/=2; } return ans; } int main() { fast_io; string s; cin>>s; int n=s.length(),m; cin>>m; forn(i,n) { forn(j,30) cnt[i+1][j]+=cnt[i][j]; cnt[i+1][s[i]-'a']++; } po[0]=1,inpo[0]=1; forn(i,n+10) { po[i+1]=(po[i]%mod*(i+1))%mod; inpo[i+1]=(inpo[i]%mod*power(i+1,mod-2))%mod; } while(m--) { int cnt2[30]={0},l,r,cnt1[30]={0},one=0,sum=0; cin>>l>>r; forn(i,30) cnt2[i]=cnt[r][i]-cnt[l-1][i]; forn(i,30) { cnt1[i]=cnt2[i]/2; one+=cnt2[i]%2; sum+=cnt1[i]; } ll ans=po[sum]; forn(i,30) ans=(ans%mod*inpo[cnt1[i]])%mod; ans=(ans%mod*max(one,1))%mod; cout<<ans<<endl; } return 0; }