#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define pb emplace_back
#define fi first
#define se second
#define md 1000000007
#define gc getchar
#define trace1(x)                cerr<<#x<<": "<<x<<endl
#define trace2(x, y)             cerr<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
#define trace3(x, y, z)          cerr<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
#define trace4(a, b, c, d)       cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
#define trace5(a, b, c, d, e)    cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl
#define trace6(a, b, c, d, e, f) cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl
#define sd(x) scanf("%d",&x)
#define slld(x) scanf("%lld",&x)
#define pd(x) printf("%d",x)
#define plld(x) printf("%lld",x)
#define br printf("\n");


typedef long long int ll;
typedef long double ld;
typedef priority_queue<int,vector<int>,greater<int> > spq; // min priority queue
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> o_set;
#define int long long int

struct ppair{
	int fi,se;
	ppair(int a,int b):fi(a),se(b){}
	ppair():fi(0),se(0){}
};
inline bool cmp(const ppair &a,const ppair &b)
{
	if(a.fi==b.fi)
		return a.se<b.se;
	return a.fi<b.fi;
}

int pmod(int a, int m){
	return (a%m + m)%m;
}
void sscan(string &s, const int MAX){
	char a[MAX];
	scanf("%s",a);
	s = string(a);
}
int stringtoint(string s){
stringstream c(s);
int x = 0;
c>>x;
return x;}

template<typename T> T power(T a,T b,T m)
{
	T ans = 1,p = a;
	while(b)
	{
		if(b&1)
			ans = (ans*p)%m;
		p = (p*p)%m;
	}
	return ans;
}

template<typename T> T gcd(T a,T b)
{
	if(b==0)
		return a;
	else
		return gcd(b,a%b);
}
template<typename T> T e_gcd(T a,T b,T &x,T &y)
{
	if(b==0)
	{
		x = 1,y = 0;
		return a;
	}
	T x1,y1;
	T g = e_gcd(b,a%b,x1,y1);
	x = y1;
	y = x1-(a/b)*y1;
	if(y<0)
	{
		y+=a;
		x-=b;
	}
	return g;
}
template<typename T> T invmod(T a,T m)
{
	T x,y,g;
	g = e_gcd(m,a,x,y);
	if(g!=1)
		return -1;
	else
		return y;
}

inline void sc(int &x)
{
register int c = gc();
bool flag = false;
x = 0;
for(;((c<48 && c!=45) || c>57);c = gc());
if(c==45)
{
flag = true;
c = gc();
}
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
if(flag)
x = x - (x<<1);
return;
}

inline void scll(ll &x)
{
register int c = gc();
bool flag = false;
x = 0;
for(;((c<48 && c!=45) || c>57);c = gc());
if(c==45)
{
flag = true;
c = gc();
}
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
if(flag)
x = x - (x<<1);
return;
}
ll pre[26][100005];
ll fact[100005];
signed main()
{
	//freopen("inputf.txt","r",stdin);
	fact[0] = 1;
	for(int i=1;i<=100000;i++)
		fact[i] = (fact[i-1]*i)%md;
	string s;
	cin>>s;
	for(int i=0;i<s.length();i++)
	{
		pre[s[i]-'a'][i+1]++;
		for(int j=0;j<26;j++)
			pre[j][i+1]+=pre[j][i];
	}
	int q;
	slld(q);
	while(q--)
	{
		int cnt[26]={0};
		int l,r;
		slld(l);slld(r);
		ll ans = 1;
		int sum = 0;
		int sum1 = 0;
		for(int i=0;i<26;i++)
		{
			cnt[i] = pre[i][r]-pre[i][l-1];
		}
		for(int i=0;i<26;i++)
		{
			if(cnt[i]&1)
			{sum1++;cnt[i]--;}
			sum+=cnt[i]/2;
			ans = (ans*invmod(fact[cnt[i]/2],(ll)md))%md;
		}
		if(sum1!=0)
		ans = (ans*sum1)%md;
		ans = (ans*fact[sum])%md;
		plld(ans);br;
	}
	return 0;
}