#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; }