func_code_string: #include <bits/stdc++.h>   using namespace std;   namespace FGF {   int n, m;   int read() {     int s = 0, w = 1;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) w = -w;       ch = getchar();     }     while (isdigit(ch)) {       s = s * 10 + ch -  0 ;       ch = getchar();     }     return s * w;   }   const int N = 1e5 + 5;   const int mo = 1e9 + 7;   char s[N];   int num[60];   inline int getnum(char c) { return c >=  a  ? c -  a  + 1 : c -  A  + 27; }   long long f[N], fac[N], inv[N], g[N], h[N], ans[60][60];   void init() {     fac[0] = inv[0] = inv[1] = 1;     for (int i = 1; i <= n / 2; i++) fac[i] = fac[i - 1] * i % mo;     for (int i = 2; i <= n / 2; i++) inv[i] = inv[mo % i] * (mo - mo / i) % mo;     for (int i = 2; i <= n / 2; i++) inv[i] = inv[i - 1] * inv[i] % mo;   }   void work() {     scanf( %s , s + 1);     n = strlen(s + 1);     for (int i = 1; i <= n; i++) num[getnum(s[i])]++;     init();     f[0] = 1;     for (int i = 1; i <= 52; i++)       for (int j = n / 2; j >= num[i]; j--)         if (num[i]) f[j] = (f[j] + f[j - num[i]]) % mo;     for (int i = 1; i <= 52; i++)       if (num[i]) {         ans[i][i] = f[n / 2];         for (int j = 0; j <= n / 2; j++)           if (j >= num[i])             g[j] = (f[j] - g[j - num[i]] + mo) % mo;           else             g[j] = f[j];         for (int j = i + 1; j <= 52; j++)           if (num[j]) {             for (int k = 0; k <= n / 2; k++)               if (k >= num[j])                 h[k] = (g[k] - h[k - num[j]] + mo) % mo;               else                 h[k] = g[k];             ans[j][i] = ans[i][j] = h[n / 2] * 2 % mo;           }       }     long long res = fac[n / 2] * fac[n / 2] % mo;     for (int i = 1; i <= 52; i++) res = res * inv[num[i]] % mo;     m = read();     while (m--) {       int x = read(), y = read();       printf( %lld n , res * ans[getnum(s[x])][getnum(s[y])] % mo);     }   }   }  // namespace FGF   int main() {     FGF::work();     return 0;   }   