import java.io.*; import java.util.*; public class P1 { public static InputReader in; public static PrintWriter out; public static long ans[]; static long fac[], ifac[], DR[] = new long[101]; static int MOD = (int) (1e9 + 7); static boolean[] isPrime; static int minPrime[]; static long dp[][]; static int n; static int d, x, y; public static void main(String[] args){ in = new InputReader(System.in); out = new PrintWriter(System.out); int t = 1; precompute(); while (t-- > 0) { String st = in.readString(); int n = st.length(); int a[][] = new int[n + 1][26]; for (int i = 0; i < n; i++) { for (int j = 0; j < 26; j++) { a[i + 1][j] += a[i][j]; if (st.charAt(i) - 'a' == j) a[i + 1][j]++; } } int q = in.nextInt(); while (q-- > 0) { int l = in.nextInt(); int r = in.nextInt(); int b[] = new int[26]; int flag = 0; int max = 0; int cnt = 0; for (int i = 0; i < 26; i++) { b[i] = a[r][i] - a[l - 1][i]; if (b[i] % 2 == 1) { flag = 1; cnt++; } max += (b[i] / 2); } max += flag; if (flag == 0) { long val = fac[max]; for (int i = 0; i < 26; i++) { int x = b[i] / 2; if (x > 0) { val = val * ifac[x]; val %= MOD; } } out.println(val); } else { long val = fac[max - 1]; for (int i = 0; i < 26; i++) { int x = b[i] / 2; if (x > 0) { val = val * ifac[x]; val %= MOD; } } val = val * cnt; val %= MOD; out.println(val); } } } out.close(); } static long mp(long a, long b){ long ans = 1; while (b != 0) { if (b % 2 == 1) ans = (ans * a) % MOD; a = (a * a) % MOD; b /= 2; } return ans % MOD; } static void precompute(){ int i; int N = 2000005; fac = new long[N]; ifac = new long[N]; fac[0] = 1; for (i = 1; i < N; i++) { fac[i] = (i * fac[i - 1]) % MOD; } ifac[N - 1] = mp(fac[N - 1], MOD - 2); for (i = N - 2; i >= 0; i--) { ifac[i] = ((i + 1) * ifac[i + 1]) % MOD; } } public static long combine(int n, int k){ if (k > n - k) { k = n - k; } long result = 1; for (int i = 0; i < k; i++) { result *= (n - i); result /= (i + 1); } return result; } static long mInv(long A){ return mp(A, MOD - 2); } static long mC(int n, int k){ // calculates C(n,k) mod p (assuming p is prime). // if(k>n-k)k=n-k; long an; // n * (n-1) * ... * (n-k+1) if (k <= 0) return 1; if (n < k) return 0; an = fac[n] % MOD; an *= ifac[n - k]; an %= MOD; an *= ifac[k]; an %= MOD; // numerator / denominator mod p. return an; } static String get(int val){ StringBuilder bin = new StringBuilder(); String b = Integer.toHexString(val); for (int j = 0; j < 8 - b.length(); j++) bin.append(0); bin.append(b); return bin.toString(); } public static class TrieNode { int count; boolean isLeaf; TrieNode[] children; public TrieNode() { this.count = 0; this.isLeaf = false; this.children = new TrieNode[2]; } } public static void insertString(TrieNode root, String s){ TrieNode curr = root; curr.count++; for (char ch : s.toCharArray()) { int index = (int) (ch - '0'); if (curr.children[index] == null) curr.children[index] = new TrieNode(); curr = curr.children[index]; curr.count++; } if (curr != null) curr.isLeaf = true; } public static boolean contains(TrieNode root, String s){ TrieNode curr = root; for (char ch : s.toCharArray()) { int index = (int) ch - '0'; if (curr.children[index] == null) return false; curr = curr.children[index]; } return curr.isLeaf; } public static void removeString(TrieNode root, String s){ TrieNode curr = root; curr.count--; for (char ch : s.toCharArray()) { int index = (int) (ch - '0'); TrieNode child = curr.children[index]; if (child == null) return; if (child.count == 1) { curr.children[index] = null; return; } else { child.count--; curr = child; } } if (curr != null) curr.isLeaf = false; } // maximization of xor - only for binary strings public static String max(TrieNode root, String s){ StringBuilder result = new StringBuilder(); TrieNode curr = root; for (char ch : s.toCharArray()) { int index = (int) ch - (int) '0'; if (curr.children[index ^ 1] != null && curr.children[index ^ 1].count > 0) { result.append(1); curr = curr.children[index ^ 1]; } else if (curr.children[index] != null && curr.children[index].count > 0) { result.append(0); curr = curr.children[index]; } else { return result.toString(); } } return result.toString(); } public static void printSorted(TrieNode node, String s){ for (char ch = 0; ch < node.children.length; ch++) { TrieNode child = node.children[ch]; if (child != null) printSorted(child, s + ch); } if (node.isLeaf) { System.out.println(s); } } static class Node implements Comparable { int u, v; long score; public Node(int u, int v) { this.u = u; this.v = v; } public void print(){ System.out.println(u + " " + v + " " + score); } public int compareTo(Node that){ return Long.compare(this.score, that.score); } } static class InputReader { private InputStream stream; private byte[] buf = new byte[8192]; private int curChar, snumChars; private SpaceCharFilter filter; public InputReader(InputStream stream) { this.stream = stream; } public int snext(){ if (snumChars == -1) throw new InputMismatchException(); if (curChar >= snumChars) { curChar = 0; try { snumChars = stream.read(buf); } catch (IOException e) { throw new InputMismatchException(); } if (snumChars <= 0) return -1; } return buf[curChar++]; } public int nextInt(){ int c = snext(); while (isSpaceChar(c)) c = snext(); int sgn = 1; if (c == '-') { sgn = -1; c = snext(); } int res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res *= 10; res += c - '0'; c = snext(); } while (!isSpaceChar(c)); return res * sgn; } public long nextLong(){ int c = snext(); while (isSpaceChar(c)) c = snext(); int sgn = 1; if (c == '-') { sgn = -1; c = snext(); } long res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res *= 10; res += c - '0'; c = snext(); } while (!isSpaceChar(c)); return res * sgn; } public int[] nextIntArray(int n){ int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = nextInt(); return a; } public String readString(){ int c = snext(); while (isSpaceChar(c)) c = snext(); StringBuilder res = new StringBuilder(); do { res.appendCodePoint(c); c = snext(); } while (!isSpaceChar(c)); return res.toString(); } public boolean isSpaceChar(int c){ if (filter != null) return filter.isSpaceChar(c); return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } public interface SpaceCharFilter { public boolean isSpaceChar(int ch); } } }