//package Hackerrank.hourrank25; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.StringTokenizer; public class B { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); PrintWriter pw = new PrintWriter(System.out); int []fact = new int[100005]; fact[0] = 1; for (int i = 1; i < fact.length; i++) fact[i] = (int)(1l*i*fact[i-1]%mod); String s = sc.next(); char[] arr = s.toCharArray(); int n = arr.length; int q = sc.nextInt(); int[][] freq = new int[26][n]; for (int i = 0; i < 26; i++) { if(arr[0]-'a' == i) freq[i][0] = 1; for (int j = 1; j < freq[i].length; j++) { freq[i][j] = freq[i][j-1]; if(arr[j]-'a' == i) freq[i][j]++; } } for (int qq = 0; qq < q; qq++) { int l = sc.nextInt()-1; int r = sc.nextInt()-1; int[] f = new int[26]; for (int i = 0; i < 26; i++) { f[i] = freq[i][r]; if(l > 0) f[i] -= freq[i][l-1]; } int odd = 0; int even = 0; for (int i = 0; i < f.length; i++) { even += f[i]/2; odd += f[i]%2; } long ans = fact[even]; if(odd > 0) ans = 1l*ans*odd%mod; for (int i = 0; i < f.length; i++) { if(f[i] > 1) { ans = 1l*ans*inv(fact[f[i]/2], mod); ans %= mod; } } System.out.println(ans); } pw.flush(); pw.close(); } static int mod = (int)1e9+7; static long inv(long x , long mod){ long r, y; for(r = 1 , y = mod - 2 ; y != 0 ;x = x * x % mod, y>>=1) if ((y & 1) == 1) r = r * x % mod; return r; } static class Scanner { StringTokenizer st; BufferedReader br; public Scanner(InputStream s) { br = new BufferedReader(new InputStreamReader(s)); } public Scanner(String s) throws FileNotFoundException { br = new BufferedReader(new FileReader(new File((s)))); } public String next() throws IOException { while (st == null || !st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); return st.nextToken(); } public int nextInt() throws IOException { return Integer.parseInt(next()); } public long nextLong() throws IOException { return Long.parseLong(next()); } public String nextLine() throws IOException { return br.readLine(); } public double nextDouble() throws IOException { String x = next(); StringBuilder sb = new StringBuilder("0"); double res = 0, f = 1; boolean dec = false, neg = false; int start = 0; if (x.charAt(0) == '-') { neg = true; start++; } for (int i = start; i < x.length(); i++) if (x.charAt(i) == '.') { res = Long.parseLong(sb.toString()); sb = new StringBuilder("0"); dec = true; } else { sb.append(x.charAt(i)); if (dec) f *= 10; } res += Long.parseLong(sb.toString()) / f; return res * (neg ? -1 : 1); } public boolean ready() throws IOException { return br.ready(); } } }