#include using namespace std; const int MOD = 1000000007; const int MAXN = 100000; typedef long long int lli; lli fac[MAXN+1]; lli facInv[MAXN+1]; lli modPow(lli a, int b) { lli x = 1, y = a; while (b > 0) { if ((b&1) == 1) { x = x * y; if (x >= MOD) x %= MOD; } y = y * y; if (y >= MOD) y %= MOD; b >>= 1; } return x; } lli modInverse(lli a) { return modPow(a, MOD-2); } string str; int st[MAXN<<2][26]; void init(int i, int s, int e) { for (int j=0; j<26; ++j) { st[i][j] = 0; } for (int j=s; j<=e; ++j) { ++st[i][str[j]-'a']; } if (s != e) { int mid = (s + e) >> 1; init(i<<1, s, mid); init((i<<1)+1, mid+1, e); } } void query(int i, int s, int e, int l, int r, int cnt[]) { if (s >= l && e <= r) { for (int j=0; j<26; ++j) { cnt[j] += st[i][j]; } } else if (s > r || e < l) { //do nothing } else { int mid = (s + e) >> 1; query(i<<1, s, mid, l, r, cnt); query((i<<1)+1, mid+1, e, l, r, cnt); } } int main() { cin >> str; init(1, 0, str.length()-1); fac[0] = 1; facInv[0] = 1; for (int i=1; i<=str.length(); ++i) { fac[i] = fac[i-1] * i; if (fac[i] >= MOD) fac[i] %= MOD; facInv[i] = modInverse(fac[i]); } int q; cin >> q; int l, r; int cnt[26]; int sumEvens; int odds; lli ans; while (q--) { cin >> l >> r; --l, --r; memset(cnt, 0, sizeof cnt); query(1, 0, str.length()-1, l, r, cnt); odds = 0; sumEvens = 0; for (int i=0; i<26; ++i) { if ((cnt[i]&1) == 1) { ++odds; --cnt[i]; } sumEvens += cnt[i]/2; } ans = fac[sumEvens]; for (int i=0; i<26; ++i) { ans *= facInv[cnt[i]/2]; if (ans >= MOD) ans %= MOD; } if (odds != 0) { ans *= odds; if (ans >= MOD) ans %= MOD; } cout << ans << endl; } return 0; }