#include <bits/stdc++.h>
using namespace std;
const int N = 4005, M = 1000000007;
int w, h;
bool flag[N][N];
long long ans;
int main() {
  scanf("%d%d", &w, &h);
  for (int i = 0; i <= w; i++)
    for (int j = 0; j <= h; j++) {
      long long even_num1, even_num2, temp_num1, temp_num2, t1, t2, t3, t4,
          temp;
      even_num1 = (w - i) >> 1;
      even_num2 = (h - j) >> 1;
      temp_num1 = ((h + 2) >> 1);
      temp_num2 = ((h + 1) >> 1);
      if (j & 1) {
        temp = temp_num1;
        temp_num1 = temp_num2;
        temp_num2 = temp;
      }
      t1 = even_num1 * temp_num1 + even_num2;
      t2 = even_num1 * temp_num2 + (h - j - even_num2);
      t3 = (w - i - even_num1) * temp_num1;
      t4 = (w - i - even_num1) * temp_num2;
      ans =
          (ans + (t1 * (t1 - 1) >> 1) + t1 * (t2 + t3 + t4) +
           (t4 * (t4 - 1) >> 1) + (t2 * (t2 - 1) >> 1) + (t3 * (t3 - 1) >> 1)) %
          M;
    }
  memset(flag, 0, sizeof(flag));
  for (int i = 0; i <= w; i++)
    for (int j = 0; j <= h; j++)
      if (!flag[i][j]) {
        if (!i && !j) continue;
        long long ii = i, jj = j, t = 1;
        while (ii + i <= w && jj + j <= h) {
          ii += i;
          jj += j;
          t++;
          flag[ii][jj] = 1;
          long long temp = ((w - ii + 1) * (h - jj + 1) * (t - 1)) % M;
          if (i && j) temp *= 2;
          ans = (ans - temp) % M;
        }
      }
  ans = ((ans + M) * 6) % M;
  printf("%I64d\n", ans);
  return 0;
}
