#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <queue>
#include <fstream>
#include <cstring>

using namespace std;
typedef long long LL;

string s;
int c[26][100010];
int MOD=1000000007;
LL f[100010], inv[100010];

int power(int x, unsigned int y, unsigned int m) {
    if (y == 0)
        return 1;
    LL p = power(x, y/2, m) % m;
    p = (1LL * p * p) % m;
 
    return (y%2 == 0)? p : (1LL * x * p) % m;
}
int modInverse(int a, int m) {
	return power(a, m-2, m);
}

int main() {
	f[0]=1;
	inv[0]=1;
	for (int i=1;i<=100000;i++) {
		f[i]=1LL*f[i-1]*i;
		f[i]%=MOD;
		inv[i]=1LL*inv[i-1]*modInverse(i, MOD);
		inv[i]%=MOD;
	}
	
	cin>>s;
	memset(c,0,sizeof(c));
	int n=s.size();
	for (int i=0;i<26;i++) {
		c[i][0]=((s[0]-'a')==i);
		for (int j=1;j<n;j++)
			c[i][j]=c[i][j-1]+((s[j]-'a')==i);
	}
	int q, l, r;
	cin>>q;
	while (q--) {
		scanf("%d%d",&l,&r);
		int ce=0, co=0;
		LL temp=1;
		for (int i=0;i<26;i++) {
			int diff=c[i][r-1]-(l<=1?0:c[i][l-2]);
			ce+=diff/2;
			co+=diff%2;
			temp*=1LL*inv[diff/2];
			temp%=MOD;
		}
		LL ret=1LL*f[ce];
		if (co>0) ret*=co;
		ret%=MOD;
		ret*=temp;
		ret%=MOD;
		cout<<ret<<endl;
	}
}