#include using namespace std; void initialize(string s) { // This function is called once before all queries. } int fact(int a) { int res = a; while (--a) { res *= a; } return res; } int answerQuery(string s, int l, int r) { // Return the answer for this query modulo 1000000007. string str = s.substr(l - 1, r - l + 1); unordered_map letters; for (int i = 0; i < r - l + 1; i++) { letters[str[i]]++; } vector num; long sum = 0; long maxOdd = 0; int numOddsMax = 0; for (auto val : letters) { if (val.second % 2 == 0) { sum += val.second / 2; num.push_back(val.second / 2); } else { if (val.second > maxOdd) { maxOdd = val.second; } } } if (maxOdd == 0) { numOddsMax = 1; } else { for (auto val : letters) { if (maxOdd == val.second) { numOddsMax++; } } } sum += maxOdd / 2; if (maxOdd > 1) { num.push_back(maxOdd / 2); } long temp = fact(sum); long div = 1; for (auto val : num) { div *= fact(val); } long res = (temp / div) % 1000000007; return res * numOddsMax; } int main() { string s; cin >> s; initialize(s); int q; cin >> q; for (int a0 = 0; a0 < q; a0++) { int l; int r; cin >> l >> r; int result = answerQuery(s, l, r); cout << result << endl; } return 0; }