import java.io.OutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.InputMismatchException; import java.io.IOException; import java.io.InputStream; /** * Built using CHelper plug-in * Actual solution is at the top */ public class Solution { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader in = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); MaximumPalindromes solver = new MaximumPalindromes(); solver.solve(1, in, out); out.close(); } static class MaximumPalindromes { int[] fact; int mod = 1000000007; public void solve(int testNumber, InputReader in, PrintWriter out) { String s = in.readString(); int n = s.length(); int q = in.readInt(); int[][] cnt = new int[26][n + 1]; for (int i = 0; i < n; i++) { for (int j = 0; j < 26; j++) { cnt[j][i + 1] = cnt[j][i] + (s.charAt(i) - 'a' == j ? 1 : 0); } } fact = new int[2800001]; fact[0] = 1; for (int i = 1; i < fact.length; i++) { fact[i] = (int) ((fact[i - 1] * (long) i) % mod); } while (q-- > 0) { int l = in.readInt() - 1; int r = in.readInt() - 1; int oddCnt = 0; long num = 0, den = 1; for (int i = 0; i < 26; i++) { int c = cnt[i][r + 1] - cnt[i][l]; if (c % 2 == 1) oddCnt++; num += c / 2; den = (den * (long) fact[c / 2]) % mod; } num = fact[(int) num]; num = (num * Math.max(oddCnt, 1)) % mod; out.println((num * pow(den, mod - 2)) % mod); } } long pow(long a, long b) { long ans = 1; while (b > 0) { if (b % 2 == 1) ans = (ans * a) % mod; b /= 2; a = (a * a) % mod; } return ans; } } static class InputReader { private InputStream stream; private byte[] buf = new byte[1024]; private int curChar; private int numChars; private InputReader.SpaceCharFilter filter; public InputReader(InputStream stream) { this.stream = stream; } public int read() { if (numChars == -1) throw new InputMismatchException(); if (curChar >= numChars) { curChar = 0; try { numChars = stream.read(buf); } catch (IOException e) { throw new InputMismatchException(); } if (numChars <= 0) return -1; } return buf[curChar++]; } public int readInt() { int c = read(); while (isSpaceChar(c)) c = read(); int sgn = 1; if (c == '-') { sgn = -1; c = read(); } int res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res *= 10; res += c - '0'; c = read(); } while (!isSpaceChar(c)); return res * sgn; } public String readString() { int c = read(); while (isSpaceChar(c)) c = read(); StringBuilder res = new StringBuilder(); do { res.appendCodePoint(c); c = read(); } while (!isSpaceChar(c)); return res.toString(); } public boolean isSpaceChar(int c) { if (filter != null) return filter.isSpaceChar(c); return isWhitespace(c); } public static boolean isWhitespace(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } public interface SpaceCharFilter { public boolean isSpaceChar(int ch); } } }