func_code_string: #include <bits/stdc++.h>   #pragma gcc optimize( O3, unroll-loops )   using namespace std;   const int mod = 1000000007;   int gcds[4001][4001];   int64_t fpow(int i, int j) {     int64_t ans = 1;     while (j--) ans *= i;     return ans;   }   signed main() {     cin.tie(0);     ios_base::sync_with_stdio(0);     int64_t n, m;     cin >> n >> m;     for (int i = 1; i <= n; i++) gcds[i][0] = i;     for (int i = 1; i <= m; i++) gcds[0][i] = i;     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         gcds[i][j] = i > j ? gcds[i % j][j] : gcds[i][j % i];     int64_t cnts = 0;     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++) {         int g = gcds[i][j];         int64_t targ = min((n - i) / (i / g), (m - j) / (j / g));         (cnts += targ * (targ + 1) * (2 * targ + 1) / 6 * (i / g) * (j / g) +                  (n - i + 1) * (m - j + 1) * targ -                  targ * (targ + 1) / 2 *                      ((n - i + 1) * (j / g) + (m - j + 1) * (i / g))) %= mod;       }     cnts = (cnts * 2 * 6 + (n + 1) * (m + 1) * (m * (m - 1) + n * (n - 1)) +             (n + 1) * (m + 1) * ((n + 1) * (m + 1) - 1) * 3 + (n + 1) * (m + 1)) %            mod;     int64_t ans = 0;     for (int i = 0; i < (1 << 6); i++)       if (~(i >> 2 & i >> 4 ^ i >> 0 & i >> 5 ^ i >> 1 & i >> 3 ^             i >> 2 & i >> 3 ^ i >> 0 & i >> 4 ^ i >> 1 & i >> 5) &           1)         ans += fpow((n + 1) / 2, __builtin_popcount(i & 7)) % mod *                fpow((n + 2) / 2, 3 - __builtin_popcount(i & 7)) % mod *                fpow((m + 1) / 2, __builtin_popcount(i >> 3)) % mod *                fpow((m + 2) / 2, 3 - __builtin_popcount(i >> 3)) % mod;     cout << ((ans - cnts) % mod + mod) % mod << endl;   }   