#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define trace(...) __f(#__VA_ARGS__, __VA_ARGS__) template void __f(const char* name, Arg1&& arg1){ cerr << name << ": " << arg1 << endl; } template void __f(const char* names, Arg1&& arg1, Args&&... args){ const char* comma = strchr(names + 1, ','); cerr.write(names, comma - names) << ": " << arg1 << " |"; __f(comma + 1, args...); } typedef long long int64; typedef pair ii; const int INF = 1 << 29; const int MOD = 1e9 + 7; const int N = 1e5 + 10; char s[N]; int cnt[N][26]; int F[N], G[N]; int64 power_mod(int64 a, int n) { int64 ret = 1; for (; n; n >>= 1) { if (n & 1) ret = ret * a % MOD; a = a * a % MOD; } return ret; } int main() { F[0] = G[0] = 1; for (int i = 1; i < N; ++i) { F[i] = (int64)F[i - 1] * i % MOD; G[i] = power_mod(F[i], MOD - 2); } scanf("%s", s); int n = strlen(s); for (int i = 0; i < n; ++i) { for (int k = 0; k < 26; ++k) { cnt[i + 1][k] = cnt[i][k]; } cnt[i + 1][s[i] - 'a']++; } int m; scanf("%d", &m); while (m--) { int L, R; scanf("%d%d", &L, &R); --L; int odd = 0, sum = 0; vector A; for (int k = 0; k < 26; ++k) { int cur = cnt[R][k] - cnt[L][k]; if (cur % 2 == 0) { A.push_back(cur / 2); sum += cur / 2; } else { ++odd; A.push_back(cur / 2); sum += cur / 2; } } int ret = F[sum]; for (auto& it : A) { ret = (int64)ret * G[it] % MOD; } if (odd == 0) odd = 1; ret = (int64)ret * odd % MOD; printf("%d\n", ret); } return 0; }