func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 1e5 + 100;   const long long mod = 1e9 + 7;   char s[maxn];   int num[55];   long long dp[maxn];   long long tmp[maxn];   long long quesnum[55][55];   long long ques[55][55];   long long inv[maxn], fac[maxn], invf[maxn];   void init(int hf) {     inv[1] = 1;     for (int i = 2; i < maxn; i++)       inv[i] = ((mod - mod / i) * inv[mod % i]) % mod;     fac[0] = 1;     for (int i = 1; i < maxn; i++) fac[i] = (fac[i - 1] * (long long)i) % mod;     invf[0] = 1;     for (int i = 1; i < maxn; i++) invf[i] = (invf[i - 1] * inv[i]) % mod;     memset(dp, 0, sizeof(dp));     memset(ques, -1, sizeof(ques));     dp[0] = 1;     for (int i = 0; i < 55; i++) {       if (!num[i]) continue;       for (int j = hf; j >= num[i]; j--) {         dp[j] = (dp[j] + dp[j - num[i]]) % mod;       }     }     for (int i = 0; i < 52; i++) {       for (int j = i; j < 52; j++) {         for (int k = 0; k <= hf; k++) tmp[k] = dp[k];         for (int k = num[i]; k <= hf; k++)           tmp[k] = (tmp[k] - tmp[k - num[i]] + mod) % mod;         if (i != j)           for (int k = num[j]; k <= hf; k++)             tmp[k] = (tmp[k] - tmp[k - num[j]] + mod) % mod;         quesnum[i][j] = quesnum[j][i] = tmp[hf];       }     }   }   int main() {     scanf( %s , s);     memset(num, 0, sizeof(num));     int len = strlen(s);     int hf = len / 2;     for (int i = 0; i < len; i++) {       if (s[i] >=  a  && s[i] <=  z )         num[s[i] -  a ]++;       else         num[s[i] -  A  + 26]++;     }     init(hf);     int q;     scanf( %d , &q);     int x, y;     while (q--) {       scanf( %d%d , &x, &y);       x--;       y--;       int idx, idy;       if (s[x] >=  a  && s[x] <=  z )         idx = s[x] -  a ;       else         idx = s[x] -  A  + 26;       if (s[y] >=  a  && s[y] <=  z )         idy = s[y] -  a ;       else         idy = s[y] -  A  + 26;       if (ques[idx][idy] != -1) {         printf( %I64d n , ques[idx][idy]);         continue;       }       long long ans;       if (idx == idy) {         if (num[idx] > hf) {           printf( 0 n );           ques[idx][idx] = 0;           continue;         }         long long cc =             ((fac[hf] * invf[num[idx]]) % mod * invf[hf - num[idx]]) % mod;         ans = ((cc * fac[hf - num[idx]]) % mod * fac[hf]) % mod;       } else {         if (num[idx] + num[idy] > hf) {           ques[idx][idy] = ques[idy][idx] = 0;           printf( 0 n );           continue;         }         int numx = num[idx], numy = num[idy];         int num_hfx = hf - numx;         long long cc1 = ((fac[hf] * invf[numx]) % mod * invf[hf - numx]) % mod;         long long cc2 =             ((fac[num_hfx] * invf[numy]) % mod * invf[num_hfx - numy]) % mod;         ans = (((cc1 * cc2) % mod * fac[hf]) % mod * fac[hf - numx - numy]) % mod;       }       for (int i = 0; i < 55; i++) {         if (i == idx || i == idy) continue;         ans = (ans * invf[num[i]]) % mod;       }       ans = (ans * quesnum[idx][idy]) % mod;       ans = (ans * 2) % mod;       ques[idx][idy] = ques[idy][idx] = ans;       printf( %I64d n , ans);     }   }   