#include <bits/stdc++.h>
using namespace std;
bool debug = false;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int p[2][2];
int gcd11(int x, int y) {
  int z = y;
  while (x % y != 0) {
    z = x % y;
    x = y;
    y = z;
  }
  return z;
}
int main() {
  int w, h;
  scanf("%d%d", &w, &h);
  long long ans = 0;
  for (int(i) = 0; (i) < (int)(w + 1); (i)++)
    for (int(j) = 0; (j) < (int)(h + 1); (j)++) {
      p[i % 2][j % 2]++;
      if (i && j) {
        int c = gcd11(i, j);
        ans += 1000000007 - 12LL * (w + 1 - i) * (h + 1 - j) * (c - 1);
      }
    }
  ans += 1000000007 - (long long)(w + 1) * (h + 1) * h * (h - 1) % 1000000007;
  ans += 1000000007 - (long long)(h + 1) * (w + 1) * w * (w - 1) % 1000000007;
  long long x = (long long)(w + 1) * (h + 1);
  ans += x * (x - 1) * (x - 2) % 1000000007;
  ans += 1000000007 - x * x * x % 1000000007;
  for (int(a) = 0; (a) < (int)(2); (a)++)
    for (int(b) = 0; (b) < (int)(2); (b)++)
      for (int(c) = 0; (c) < (int)(2); (c)++)
        for (int(d) = 0; (d) < (int)(2); (d)++)
          for (int(f) = 0; (f) < (int)(2); (f)++)
            for (int(e) = 0; (e) < (int)(2); (e)++) {
              int aa = c - a, bb = d - b;
              int cc = e - a, dd = f - b;
              if ((aa * dd - bb * cc) % 2 == 0)
                ans += (long long)p[a][b] * p[c][d] % 1000000007 * p[e][f] %
                       1000000007;
            }
  printf("%lld\n", ans % 1000000007);
  return 0;
}
