#include #include #include #include #include #include using namespace std; typedef long long LL; typedef vector VI; #define REP(i,n) for(int i=0, i##_len=(n); i inline void amin(T &x, const T &y) { if (y inline void amax(T &x, const T &y) { if (x void rprintf(const char *fmt, Iter begin, Iter end) { for (bool sp=0; begin!=end; ++begin) { if (sp) putchar(' '); else sp = true; printf(fmt, *begin); } putchar('\n'); } template struct ModInt { static const unsigned static_MOD = MOD; unsigned x; void undef() { x = (unsigned)-1; } bool isnan() const { return x == (unsigned)-1; } inline int geti() const { return (int)x; } ModInt() { x = 0; } ModInt(const ModInt &y) { x = y.x; } ModInt(int y) { if (y<0 || (int)MOD<=y) y %= (int)MOD; if (y<0) y += MOD; x=y; } ModInt(unsigned y) { if (MOD<=y) x = y % MOD; else x = y; } ModInt(long long y) { if (y<0 || MOD<=y) y %= MOD; if (y<0) y += MOD; x=y; } ModInt(unsigned long long y) { if (MOD<=y) x = y % MOD; else x = y; } ModInt &operator+=(const ModInt y) { if ((x += y.x) >= MOD) x -= MOD; return *this; } ModInt &operator-=(const ModInt y) { if ((x -= y.x) & (1u<<31)) x += MOD; return *this; } ModInt &operator*=(const ModInt y) { x = (unsigned long long)x * y.x % MOD; return *this; } ModInt &operator/=(const ModInt y) { x = (unsigned long long)x * y.inv().x % MOD; return *this; } ModInt operator-() const { return (x ? MOD-x: 0); } ModInt inv() const { unsigned a = MOD, b = x; int u = 0, v = 1; while (b) { int t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } if (u < 0) u += MOD; return ModInt(u); } ModInt pow(long long y) const { ModInt b = *this, r = 1; if (y < 0) { b = b.inv(); y = -y; } for (; y; y>>=1) { if (y&1) r *= b; b *= b; } return r; } friend ModInt operator+(ModInt x, const ModInt y) { return x += y; } friend ModInt operator-(ModInt x, const ModInt y) { return x -= y; } friend ModInt operator*(ModInt x, const ModInt y) { return x *= y; } friend ModInt operator/(ModInt x, const ModInt y) { return x *= y.inv(); } friend bool operator<(const ModInt x, const ModInt y) { return x.x < y.x; } friend bool operator==(const ModInt x, const ModInt y) { return x.x == y.x; } friend bool operator!=(const ModInt x, const ModInt y) { return x.x != y.x; } }; const LL MOD = 1000000007; typedef ModInt Mint; const int MAX = 100011; Mint inv[MAX+1], fact[MAX+1], fact_inv[MAX+1]; void init() { inv[1] = 1; for (int i=2; i<=MAX; i++) inv[i] = inv[MOD%i] * (MOD-MOD/i); fact[0] = fact_inv[0] = 1; for (int i=1; i<=MAX; i++) { fact[i] = fact[i-1] * i; fact_inv[i] = fact_inv[i-1] * inv[i]; } } Mint nCk(int n, int k) { return fact[n] * fact_inv[k] * fact_inv[n-k]; } int N; char S[MAX]; int sums[26][MAX]; LL B[26]; int Q; void MAIN() { init(); scanf("%s", S); N = strlen(S); REP (i, N) { REP (c, 26) sums[c][i+1] = sums[c][i]; sums[S[i] - 'a'][i+1]++; } scanf("%d", &Q); REP ($, Q) { int L, R; scanf("%d%d", &L, &R); L--; REP (c, 26) B[c] = sums[c][R] - sums[c][L]; int odd = 0; int len = 0; Mint cnt = 1; REP (c, 26) { cnt *= nCk(len + B[c] / 2, len); len += B[c] / 2; odd += B[c] & 1; } if (odd) cnt *= odd; printf("%d\n", cnt.geti()); } } int main() { int TC = 1; // scanf("%d", &TC); REP (tc, TC) MAIN(); return 0; }