#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;
}