#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define gc getchar
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(),(x).end()
#define x1 uvuvwevwevwe
#define y1 onyetenyevwe
#define x2 ugwemubwem
#define y2 ossas
typedef long long LL;
typedef long double LD;
typedef pair<int,int> pii;
template <typename T> void scan(T &angka){
	angka=0;char input=gc();T kali=1;
	while(!(48<=input&&input<=57)){	if(input=='-')	kali=-1;input=gc();}
	while(48<=input&&input<=57)	angka=(angka<<3)+(angka<<1)+input-48,input=gc();angka*=kali;
}
template <typename T1,typename T2> void scan(T1 &angka1,T2 &angka2){
	scan(angka1);scan(angka2);
}
const LL mods=1000000007LL;
const int MAXN=100000;
struct M{
	LL x;
	M(LL angka){
		if(angka>=mods||angka<=-mods)
			angka%=mods;
		if(angka<0)
			angka+=mods;
		x=angka;
	}
	M(){
		x=0;
	}
	
	M operator + (const M &other) const{
		return M(x+other.x);
	}
	M operator - (const M &other) const{
		return M(x-other.x);
	}
	M operator * (const M &other) const{
		return M(x*other.x);
	}
	M operator - () const{
		return M(-x);
	}
	bool operator == (const M &other) const{
		return x==other.x;
	}
};
struct listocc{
	int occ[26];
	listocc(){
		for(int i=0;i<26;i++)
			occ[i]=0;
	}
	listocc operator - (const listocc &other) const{
		listocc ret;
		for(int i=0;i<26;i++)
			ret.occ[i]=occ[i]-other.occ[i];
		return ret;
	}
};
listocc pre[MAXN+5],occurence;
int panjang,q;
string input;
M fakt[MAXN+5],inv[MAXN+5];
M DnC(M angka,int pangkat){
	if(pangkat==0)
		return M(1);
	M ret=DnC(angka,pangkat>>1);
	ret=ret*ret;
	if(pangkat&1)
		ret=ret*angka;
	return ret;
}
M invers(M x){
	return DnC(x,mods-2);
}
void isifakt(){
	fakt[0]=1;
	for(int i=1;i<=MAXN;i++)
		fakt[i]=fakt[i-1]*i;
	for(int i=0;i<=MAXN;i++)
		inv[i]=invers(fakt[i]);
}
int main()
{
	isifakt();
	cin>>input;
	panjang=input.length();
	for(int i=0;i<panjang;i++)
	{
		pre[i+1]=pre[i];
		pre[i+1].occ[input[i]-'a']++;
	}
	scanf("%d",&q);
	for(int i=0;i<q;i++)
	{
		int l,r;
		scan(l,r);
		occurence=pre[r]-pre[l-1];
		int ganjil=0,sum=0;
		M ans=1;
		for(int j=0;j<26;j++)
		{
			if(occurence.occ[j]&1)		//ganjil
				ganjil++;
			sum+=occurence.occ[j]>>1;
			ans=ans*inv[occurence.occ[j]>>1];
		}
		ans=ans*fakt[sum];
		if(ganjil==0)
			ganjil=1;
		ans=ans*ganjil;
		cout<<ans.x<<endl;
	}
}