#include <bits/stdc++.h>
using namespace std;
int gd[4001][4001];
long long gcd(long long a, long long b) {
  if (a == 0) return b;
  return gd[b % a][a];
}
void getgcd() {
  for (int i = 0; i < 4001; i++)
    for (int j = i; j < 4001; j++) gd[j][i] = gd[i][j] = gcd(i, j);
}
long long count(long long x, long long y) {
  long long xe = (x - 1) >> 1;
  long long xo = x >> 1;
  long long ye = (y - 1) >> 1;
  long long yo = y >> 1;
  long long ans = 0;
  if ((x & 1) && (y & 1)) {
    ans += xo * yo;
  } else {
    ans += xo * ye;
    ans += xe * ye;
    ans += xe * yo;
  }
  ans *= 4;
  long long ans1 = 0;
  if ((x & 1) && (y & 1)) {
    ;
  } else
    ans1 += x + y - 2;
  if (y & 1) {
    if (x & 1)
      ans1 += xo << 1;
    else
      ans1 += xe << 1;
  } else {
    ans1 += (x - 1) << 1;
  }
  if (x & 1) {
    if (y & 1)
      ans1 += yo << 1;
    else
      ans1 += ye << 1;
  } else {
    ans1 += (y - 1) << 1;
  }
  ans1 *= 2;
  long long ans4 = 0;
  if (x & 1) {
    if (y & 1) {
      ans4 = xo * yo + xe * ye;
    } else {
      ans4 = (x - 1) * ye;
    }
  } else {
    if (y & 1) {
      ans4 = (y - 1) * xe;
    } else {
      ans4 = (x - 1) * (y - 1);
    }
  }
  ans4 -= gd[x][y] - 1;
  ans4 *= 2;
  ans += ans1;
  ans += ans4;
  if (!((x & 1) && (y & 1))) ans += 4;
  ans %= 1000000007;
  return ans;
}
int main() {
  getgcd();
  long long n, m;
  cin >> n >> m;
  long long ans = 0;
  for (long long i = 1; i <= n; i++)
    for (long long j = 1; j <= m; j++) {
      ans += (n + 1 - i) * (m + 1 - j) * count(i, j);
      ans %= 1000000007;
    }
  cout << (6 * ans) % 1000000007 << endl;
  return 0;
}
