#include //#include // Common file //#include // Including seg_tree_order_statistics_node_update #include #include using namespace std; //using namespace __gnu_pbds; typedef long long lo; typedef long double ld; typedef pair ll;//pair typedef vector vl; //vector of long typedef vector vll; //vector of pair typedef priority_queuep_q; typedef vector< vl > vvl; //vector of vectors #define X first #define Y second #define mp(a,b) make_pair((a),(b)) #define REP(a,b) for(lo i=(a);i<(lo)b;i++)//no need to declare variable i #define REPE(a,b,c,d) REP(a,b)for(lo j=(c);j<(lo)d;j++)//no need to declare vaiables i,j #define REPV(a,b,c) for(lo(a)=b;(a)<(c);(a)++)//a is the variable #define IREP(a,b) for(lo i=(a);i>=(b);i--) #define IREPV(a,b,c) for(lo(a)=b;(a)>=(c);(a)--) #define all(v) (v).begin(),(v).end() #define TRV(a) for(auto &it : a) #define INF 101000 #define MOD 1000000007 #define M 1000000007 #define BLOCK 300 #define CHECK_BIT(var,pos) ((var) & (1<<(pos))) #define pb(a) push_back((a)) #define eps 1e-2 #define PI acos(-1.0) #define debug(x) cout<<#x<<"="< ostream& operator<< ( ostream &o,vector v ) { if ( v.size() >0 )o< ostream& operator<< ( ostream &o,pair p ) { return o<<"("< istream& operator>> ( istream &in,vector &v ) { for ( unsigned i=0; i>v[i]; return in; } template istream& operator>> ( istream &in,pair &p ) { in>>p.X; in>>p.Y; return in; } lo inv(lo a, lo m=MOD){ lo m0 = m, t, q; lo x0 = 0, x1 = 1; if (m == 1)return 0; while (a > 1){ q = a / m; t = m; m = a % m, a = t; t = x0; x0 = x1 - q * x0; x1 = t; } if (x1 < 0)x1 += m0; return x1; } int main(){ std::ios::sync_with_stdio(false); cin.tie(0);cout.tie(0);cout.precision(20); string a; cin>>a; lo n=a.length(); lo t; vvl cnt(n+1,vl(26,0)); REP(0,n){ REPV(j,0,26){ if(a[i]-'a'==j)cnt[i+1][j]++; cnt[i+1][j]+=cnt[i][j]; } } vl factorial(INF,1),invfact(INF,1); REP(2,INF){ factorial[i]=(factorial[i-1]*i)%MOD; invfact[i]=(invfact[i-1]*inv(i))%MOD; } cin>>t; while(t--){ lo l,r; cin>>l>>r; lo sum=0; lo ans=1; vl div; REP(0,26){ if((cnt[r][i]-cnt[l-1][i])%2==1)sum++; if((cnt[r][i]-cnt[l-1][i])/2)div.pb((cnt[r][i]-cnt[l-1][i])/2); } ans=factorial[accumulate(all(div),lo(0))]; REP(0,div.size())ans=(ans*invfact[div[i]])%MOD; if(sum)ans=(ans*sum)%MOD; cout<