#include using namespace std; //using namespace __gnu_pbds; typedef long long int ll; typedef long double ld; typedef pair ii; typedef vector< ii > vii; typedef vector vi; typedef vector< vi > vvi; //typedef tree,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<>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<