#include using namespace std ; #define pb push_back #define mp make_pair #define infile() freopen("large.in","r",stdin); #define output() freopen("output.txt","w",stdout); #define ll long long #define sc(t); scanf("%d",&t); #define scl(t); scanf("%lld",&t); #define sc2(n,m); scanf("%d%d",&n,&m); #define scl2(n,m); scanf("%lld%lld",&n,&m); #define debug(); printf("tushar\n"); #define N 200005 #define mod 1000000007 #define printi(n) printf("%d",n); #define inf ((1<<29)-1) #define linf ((1LL<<60)-1) const double eps = 1e-9; set < ll > :: iterator it ; vector < ll > v ; vector < int > vi ; int n,m,q,k ; char str[N] ; int a[N] ; int len ; #define BLOCK 450 struct s{ int L,R,I ; }; s arr[200005] ; long long anss = 0 ; long long ans[200005][27] = {0} ; int hs[1000005] = {0} ; ll fact[N] ; ll invfact[N] ; bool cmp(s a ,s b) { if((a.L)/BLOCK != (b.L)/BLOCK) { return (a.L)/BLOCK < (b.L)/BLOCK; } return a.R < b.R ; } void add(int index) { hs[a[index]]++; } void remove(int index) { hs[a[index]]--; } ll power(ll x, ll y) { ll res = 1; x = x % mod; while (y > 0) { if (y & 1) res = (res*x) % mod; y = y>>1; x = (x*x) % mod; } return res%mod; } int main() { int i , j , t ; fact[0]=1LL; for(ll i=1LL;i<=N;i++) { fact[i] = (ll)(fact[i-1]*i); fact[i]%=mod; invfact[i] = power(fact[i],mod-2) ; } scanf("%s",str) ; len = strlen(str) ; for(i=1;i<=len;i++) a[i] = (int)(str[i-1]-'a' +1) ; sc(m) ; for(i=1;i<=m;i++) { int x,y ; scanf("%d %d",&x,&y) ; arr[i].L = x ; arr[i].R = y ; arr[i].I = i ; } sort(arr+1,arr+m+1,cmp) ; int currentl = 1 ; int currentr = 1 ; for(i=1;i<=m;i++) { int left = arr[i].L ; int right = arr[i].R ; int index = arr[i].I; // printf("left = %d right = %d index = %d\n",left,right,index) ; while(currentl > left) { currentl-- ; add(currentl) ; } while(currentr <= right) { add(currentr) ; currentr++ ; } while(currentl < left) { remove(currentl) ; currentl++ ; } while(currentr > right+1) { remove(--currentr) ; } for(j=1;j<=26;j++) ans[index][j]=hs[j]; } for(i=1;i<=m;i++) { ll odd = 0LL; ll even = 0LL ; vector < ll > v ; for(j=1;j<=26;j++) { if(ans[i][j]&1) odd++ ; even = even + ans[i][j]/2 ; if((ans[i][j]/2)) v.pb(ans[i][j]/2); } ll ans2 = fact[even] ; for(j = 0 ;j < v.size() ; j++) { ans2%=mod ; ans2 = ans2*invfact[v[j]] ; } ans2%=mod ; if(odd) ans2 = ans2*odd ; ans2%=mod ; printf("%lld\n",ans2); } return 0 ; }