#include <set>          
#include <map>           
#include <list>
#include <ctime>
#include <deque>         
#include <bitset>        
#include <vector>
#include <list>
#include <stack>
#include <random>		 
#include <string>       
#include <numeric>      //  needed for  accumulate
#include <utility>     // needed for std:: move
#include <iterator> 
#include <fstream>
#include <iostream> 
#include <iomanip>  
#include <algorithm> 
#include <functional>  
#include <unordered_map>  
#include <unordered_set>
#include <cmath>   
#include <cstring>      
#pragma warning(disable:4996) // ignore this
#define ve vector
#define pb push_back
#define mp make_pair                     
#define srt(x) sort(x.begin(),x.end())         
#define mod static_cast<long long> (1e9+7)     
#define sumx(x) accumulate(x.begin(),x.end(),0LL)
#define all(x) x.begin(),x.end()
#define int2 int64_t
#define pi 3.14159265358979323846
#define testing 0
#define code_chef 1
#define code_jam 0
#define getcx getchar
#define rep(i,a,b) for(long long i=a;i<b;i++)
using namespace std;
template<typename T>
T max(T A)
{
	return A;
}
template<typename T, typename... args>
T max(T A, T B, args... S)
{
	return max(A > B ? A : B, S...);
}
template<typename T>
T min(T A)
{
	return A;
}
template<typename T, typename... args>
T min(T A, T B, args... S)
{
	return min(A > B ? A : B, S...);
}
template<typename T>
istream& operator >> (istream& in, ve<T> &v)
{
	for (auto &x : v)
		in >> x;
	return in;
}
template<typename T>
ostream& operator<<(ostream& in, ve<T> &v)
{
	for (auto &x : v)
		in << x << " ";
	return in;
}
long long fast(long long a, long long b, long long pr)
{
	if (b == 0)
		return 1 % pr;
	long long ans = 1 % pr;
	while (b)
	{
		if (b & 1)
		{
			ans *= a;
			ans %= pr;
		}
		b >>= 1;
		a *= a;
		a %= pr;
	}
	return ans;
}
int readInt()
{
	int m = 0;
	scanf("%d",&m);
	return m;
}
long long inv_(long long val)
{
	return fast(val, mod - 2, mod);
}
// Code code code
char S[100001];
int Z = 2 + 1e6;
int *fact = new int[Z + 1];
int *invfact = new int[Z + 1], *mod_inv = new int[Z + 1];
class solve
{

public:
	solve()
	{
		ve<int> v[26];
		scanf("%s",&S);
		int n=strlen(S);
		for(int i=0;i<26;i++)
		{
			v[i].resize(n+1);
		}
		for(int i=0;i<n;i++)
		{
			S[i]-='a';
			v[S[i]][i+1]=v[S[i]][i]+1;
			for(int j=0;j<26;j++)
			{
				if(j!=S[i])
					v[j][i+1]=v[j][i];
			}
		}
		int q=readInt();
		ve<int> R(26);
		for(int i=0;i<q;i++)
		{
			int l=readInt()-1,r=readInt()-1;
			for(int j=0;j<26;j++)
			{
				R[j]=v[j][r+1]-v[j][l];
			}
			printf("%d\n",calc(R));
		}
	}
	int calc(ve<int> &v)
	{
		int Len=0;
		ve<int> Tpe;
		int r=0;
		for(int i=0;i<26;i++)
		{
			if(v[i]/2)
			{
				Len+=v[i]/2;
				Tpe.push_back(v[i]/2);
			}
			v[i]%=2;
			if(v[i])
				++r;
		}
		long long ans=fact[Len];
		for(int i=0;i<Tpe.size();i++)
		{
			ans*=invfact[Tpe[i]];
			ans%=mod;
		}
		return (ans*max(r,1))%mod;
	}
};
int main()
{
	fact[0] = 1;
	invfact[0] = 1;
	long long P=mod;
	mod_inv[1] = 1;
	for (long long int i = 2; i <= Z; i++) {
		mod_inv[i] = (-(P / i) * mod_inv[P% i]) % P + P;
	}
	for (long long int i = 1; i <= Z; i++)
	{
		fact[i] = (fact[i - 1] * i) % P;
		invfact[i] = (invfact[i - 1] * (1LL * mod_inv[i])) % P;
	}
	int t = 1, i = 0;
//	freopen("C:\\Users\\Xenor\\Documents\\sample\\New folder\\in.txt", "r", stdin);
	//freopen("C:\\Users\\Xenor\\Downloads\\gb2.txt","w",stdout);
	if (code_chef)
		scanf("%d", &t);
	while (t--)
	{
		if (code_jam)
			printf("Case #%d: ", i++);
		new solve;
	}
	return 0;
}