func_code_string: #include <bits/stdc++.h>   using namespace std;   const int s_size = 1e5 + 5;   const int mod = 1e9 + 7;   int f[(s_size + 1) >> 1] = {1}, t[(s_size + 1) >> 1], g[(s_size + 1) >> 1];   int fac[s_size] = {1}, inv[s_size], ans[s_size];   int num(char c);   void fac_inv(void);   int qpow(int a, int b);   int main(void) {     int q, x, y, cnt[55] = {0}, plan[55][55];     string s;     cin >> s >> q;     s =  0  + s;     int length = s.size() - 1, upper = (length >> 1);     for (int i = 1; i <= length; i++) cnt[num(s[i])]++;     fac_inv();     int coe = (static_cast<long long>(fac[upper]) * fac[upper]) % mod;     for (int i = 1; i <= 52; i++)       if (cnt[i] > 0) {         coe = (static_cast<long long>(coe) * inv[cnt[i]]) % mod;         for (int j = upper; j >= cnt[i]; j--) f[j] = (f[j] + f[j - cnt[i]]) % mod;       }     for (int i = 1; i <= 52; i++)       if (cnt[i] > 0) {         plan[i][i] = f[upper];         for (int j = 0; j <= upper; j++)           if (j >= cnt[i])             t[j] = (static_cast<long long>(f[j]) - t[j - cnt[i]] + mod) % mod;           else             t[j] = f[j];         for (int j = i + 1; j <= 52; j++)           if (cnt[j] > 0) {             for (int k = 0; k <= upper; k++) {               if (k >= cnt[j])                 g[k] = (static_cast<long long>(t[k]) - g[k - cnt[j]] + mod) % mod;               else                 g[k] = t[k];               plan[i][j] = (static_cast<long long>(2) * g[upper]) % mod;               plan[j][i] = plan[i][j];             }           }       }     for (int i = 1; i <= q; i++) {       cin >> x >> y;       ans[i] = (static_cast<long long>(coe) * plan[num(s[x])][num(s[y])]) % mod;     }     for (int i = 1; i <= q; i++) cout << ans[i] << endl;     return 0;   }   inline int num(char c) { return islower(c) ? c -  a  + 1 : c -  A  + 27; }   void fac_inv(void) {     for (int i = 1; i <= s_size - 5; i++)       fac[i] = (static_cast<long long>(fac[i - 1]) * i) % mod;     inv[s_size - 5] = qpow(fac[s_size - 5], mod - 2);     for (int i = s_size - 6; i >= 0; i--)       inv[i] = (static_cast<long long>(inv[i + 1]) * (i + 1)) % mod;   }   int qpow(int a, int b) {     int ret = 1;     while (b > 0) {       if ((b & 1) == 1) ret = (static_cast<long long>(ret) * a) % mod;       a = (static_cast<long long>(a) * a) % mod;       b >>= 1;     }     return ret;   }   