Problem: The Little Elephant is playing with the Cartesian coordinates' system. Most of all he likes playing with integer points. The Little Elephant defines an integer point as a pair of integers (x; y), such that 0 ≤ x ≤ w and 0 ≤ y ≤ h. Thus, the Little Elephant knows only (w + 1)·(h + 1) distinct integer points.

The Little Elephant wants to paint a triangle with vertexes at integer points, the triangle's area must be a positive integer. For that, he needs to find the number of groups of three points that form such triangle. At that, the order of points in a group matters, that is, the group of three points (0;0), (0;2), (2;2) isn't equal to the group (0;2), (0;0), (2;2).

Help the Little Elephant to find the number of groups of three integer points that form a nondegenerate triangle with integer area.

Input

A single line contains two integers w and h (1 ≤ w, h ≤ 4000).

Output

In a single output line print an integer — the remainder of dividing the answer to the problem by 1000000007 (109 + 7).

Examples

Input

2 1


Output

36


Input

2 2


Output

240

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int n, m, c[4];
long long f[4009][4009];
bool check(int a, int b) {
  int xx1 = a >> 1, yy1 = a & 1, xx2 = b >> 1, yy2 = b & 1;
  return ((xx1 & yy2) ^ (xx2 & yy1)) == 0;
}
int gcd(int a, int b) {
  while (b) b ^= a ^= b ^= a %= b;
  return a;
}
int main() {
  long long res = 0;
  cin >> n >> m;
  c[0] = (n / 2 + 1) * (m / 2 + 1);
  c[1] = (n / 2 + 1) * ((m + 1) / 2);
  c[2] = ((n + 1) / 2) * (m / 2 + 1);
  c[3] = ((n + 1) / 2) * ((m + 1) / 2);
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
      for (int k = 0; k < 4; k++)
        if (check(i ^ j, i ^ k)) {
          int t[4];
          long long d = 1;
          memset(t, 0, sizeof(t));
          if (++t[i] > c[i]) continue;
          if (++t[j] > c[j]) continue;
          if (++t[k] > c[k]) continue;
          for (int x = 0; x < 4; x++)
            for (int y = 0; y < t[x]; y++) d = d * (c[x] - y) % 1000000007ll;
          res += d;
        }
  res %= 1000000007ll;
  for (int i = 1; i <= n + 1; i++)
    for (int j = 1; j <= m + 1; j++) {
      f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1];
      if (i == 1 && j == 1) continue;
      f[i][j] += gcd(i - 1, j - 1) - 1;
      f[i][j] %= 1000000007ll;
      long long t = f[i][j] * 2;
      if (i > 2) t -= (i - 2) * (i - 1) / 2;
      if (j > 2) t -= (j - 2) * (j - 1) / 2;
      res = (res - t * 6) % 1000000007ll;
    }
  cout << (res + 1000000007ll) % 1000000007ll << endl;
}