#include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define pb emplace_back #define fi first #define se second #define md 1000000007 #define gc getchar #define trace1(x) cerr<<#x<<": "<<x<<endl #define trace2(x, y) cerr<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl #define trace3(x, y, z) cerr<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl #define trace4(a, b, c, d) cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl #define trace5(a, b, c, d, e) cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl #define trace6(a, b, c, d, e, f) cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl #define sd(x) scanf("%d",&x) #define slld(x) scanf("%lld",&x) #define pd(x) printf("%d",x) #define plld(x) printf("%lld",x) #define br printf("\n"); typedef long long int ll; typedef long double ld; typedef priority_queue<int,vector<int>,greater<int> > spq; // min priority queue typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> o_set; #define int long long int struct ppair{ int fi,se; ppair(int a,int b):fi(a),se(b){} ppair():fi(0),se(0){} }; inline bool cmp(const ppair &a,const ppair &b) { if(a.fi==b.fi) return a.se<b.se; return a.fi<b.fi; } int pmod(int a, int m){ return (a%m + m)%m; } void sscan(string &s, const int MAX){ char a[MAX]; scanf("%s",a); s = string(a); } int stringtoint(string s){ stringstream c(s); int x = 0; c>>x; return x;} template<typename T> T power(T a,T b,T m) { T ans = 1,p = a; while(b) { if(b&1) ans = (ans*p)%m; p = (p*p)%m; } return ans; } template<typename T> T gcd(T a,T b) { if(b==0) return a; else return gcd(b,a%b); } template<typename T> T e_gcd(T a,T b,T &x,T &y) { if(b==0) { x = 1,y = 0; return a; } T x1,y1; T g = e_gcd(b,a%b,x1,y1); x = y1; y = x1-(a/b)*y1; if(y<0) { y+=a; x-=b; } return g; } template<typename T> T invmod(T a,T m) { T x,y,g; g = e_gcd(m,a,x,y); if(g!=1) return -1; else return y; } inline void sc(int &x) { register int c = gc(); bool flag = false; x = 0; for(;((c<48 && c!=45) || c>57);c = gc()); if(c==45) { flag = true; c = gc(); } for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;} if(flag) x = x - (x<<1); return; } inline void scll(ll &x) { register int c = gc(); bool flag = false; x = 0; for(;((c<48 && c!=45) || c>57);c = gc()); if(c==45) { flag = true; c = gc(); } for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;} if(flag) x = x - (x<<1); return; } ll pre[26][100005]; ll fact[100005]; signed main() { //freopen("inputf.txt","r",stdin); fact[0] = 1; for(int i=1;i<=100000;i++) fact[i] = (fact[i-1]*i)%md; string s; cin>>s; for(int i=0;i<s.length();i++) { pre[s[i]-'a'][i+1]++; for(int j=0;j<26;j++) pre[j][i+1]+=pre[j][i]; } int q; slld(q); while(q--) { int cnt[26]={0}; int l,r; slld(l);slld(r); ll ans = 1; int sum = 0; int sum1 = 0; for(int i=0;i<26;i++) { cnt[i] = pre[i][r]-pre[i][l-1]; } for(int i=0;i<26;i++) { if(cnt[i]&1) {sum1++;cnt[i]--;} sum+=cnt[i]/2; ans = (ans*invmod(fact[cnt[i]/2],(ll)md))%md; } if(sum1!=0) ans = (ans*sum1)%md; ans = (ans*fact[sum])%md; plld(ans);br; } return 0; }