/*input week 2 1 4 2 3 */ #include using namespace std; struct Uzklausa { int l, r, i; }; const long long mod = 1000000007; long long power(long long x, long long y) { if (y == 0) return 1; long long p = power(x, y / 2) % mod; p = (p * p) % mod; return (y % 2 == 0) ? p : (x * p) % mod; } long long modInverse(long long a) { return power(a, mod - 2); } // To compute x^y under modulo m int main () { string s; cin >> s; int q; cin >> q; Uzklausa uzk[q]; long long fakt[100005]; long long faktinv[100005]; fakt[0] = 1; faktinv[0] = 1; for (int i = 1; i < 100005; i++) { fakt[i] = (fakt[i - 1] * i) % mod; faktinv[i] = modInverse(fakt[i]); } for (int i = 0; i < q; i++) { cin >> uzk[i].l >> uzk[i].r; uzk[i].i = i; uzk[i].l--; } const int SAK = 320; sort(uzk, uzk + q, [](const auto & i, const auto & j) -> bool { if (i.l / SAK == j.l / SAK) return i.r < j.r; return i.l < j.l; }); int pr = 0, pa = 0; int kie[27] = {}; long long ats[q] = {}; for (auto && x : uzk) { //cout << x.l << " " << x.r << endl; while (pa < x.r) kie[s[pa++] - 'a']++; while (x.l < pr) kie[s[--pr] - 'a']++; while (pa > x.r) kie[s[--pa] - 'a']--; while (x.l > pr) kie[s[pr++] - 'a']--; long long did = 0, vien = 0; for (int i = 0; i < 27; i++) { did += kie[i] / 2; vien += kie[i] % 2; //cout << kie[i] << " "; } if (vien == 0) vien = 1; ats[x.i] = (fakt[did] * vien) % mod; for (int i = 0; i < 27; i++) { ats[x.i] *= faktinv[kie[i] / 2]; ats[x.i] %= mod; } } for (int i = 0; i < q; i++) cout << ats[i] << "\n"; return 0; }