#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define pb push_back #define f first #define s second #define mp make_pair #define SZ(x) ((int)(x.size())) #define FOI(i, a, n) for(int i = int(a); i <= int(n); i++) #define FOD(i, a, n) for(int i = int(a); i >= int(n); i--) #define IN(x, y) ((y).find(x) != (y).end()) #define sync ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); typedef long long ll; typedef long double lf; typedef pair < int, ll > ii; const int NMAX = 1e5+4; const ll MOD = 1e9 + 7; ll x,y; template T gcd(T a,T b){if(a==0) {x=0,y=1; return b;}T gc=gcd(b%a,a);T temp;temp=x;x=y-(b/a)*temp;y=temp;return gc;}//y is the inverse and a is modulus and define x & y ll po(ll a, ll x,ll m){ if(x==0){return 1;}ll ans=1;ll k=1; while(k<=x) {if(x&k){ans=((ans*a)%m);} k<<=1; a*=a; a%=m; }return ans; } //(a^x)%m int pre[27][NMAX]; ll fact[NMAX]; ll inve[NMAX]; void cal() { fact[0] = inve[0]=1; fact[1] = inve[1] =1; FOI(i,2,NMAX-1) { fact[i] = (fact[i-1]*i)%MOD; gcd(MOD,fact[i]); y+=MOD; inve[i] = y%MOD; } } int main() { sync string s; cin>>s; cal(); int l = s.size(); FOI(i,0,l-1) pre[s[i]-97][i+1] = 1; FOI(i,0,25) FOI(j,1,l) pre[i][j] += pre[i][j-1]; int q; cin>>q; while(q--) { int l,r; cin>>l>>r; int cn1 = 0; int cn2 = 0; FOI(i,0,25) { cn1 += (pre[i][r] - pre[i][l-1])%2; cn2 +=(pre[i][r] - pre[i][l-1])/2; } ll ans = fact[cn2]; FOI(i,0,25) { cn2 =(pre[i][r] - pre[i][l-1])/2; ans *= inve[cn2]; ans%= MOD; } if(cn1!=0) ans*= cn1; ans%= MOD; cout<