#include <bits/stdc++.h>
using namespace std;
int m, n;
int xc, xl, yc, yl, c[2][2];
long long r, res, k1, k2;
bool ok(int x1, int y1, int x2, int y2, int x3, int y3) {
  return ((x1 - x2) * (y1 + y2) + (x2 - x3) * (y2 + y3) +
          (x3 - x1) * (y3 + y1)) %
             2 ==
         0;
}
int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
int main() {
  cin >> m >> n;
  xc = (m + 2) / 2;
  xl = (m + 1) / 2;
  yc = (n + 2) / 2;
  yl = (n + 1) / 2;
  c[0][0] = xc * yc;
  c[1][1] = xl * yl;
  c[0][1] = xc * yl;
  c[1][0] = xl * yc;
  res = 0;
  for (int x1 = 0; x1 <= 1; x1++)
    for (int y1 = 0; y1 <= 1; y1++)
      if (c[x1][y1] > 0) {
        k1 = c[x1][y1];
        c[x1][y1]--;
        for (int x2 = 0; x2 <= 1; x2++)
          for (int y2 = 0; y2 <= 1; y2++)
            if (c[x2][y2] > 0) {
              k2 = c[x2][y2];
              c[x2][y2]--;
              for (int x3 = 0; x3 <= 1; x3++)
                for (int y3 = 0; y3 <= 1; y3++)
                  if (c[x3][y3] > 0)
                    if (ok(x1, y1, x2, y2, x3, y3))
                      res = (res + c[x3][y3] * ((k1 * k2) % 1000000007)) %
                            1000000007;
              c[x2][y2]++;
            }
        c[x1][y1]++;
      }
  for (int i = 0; i <= m; i++)
    for (int j = 0; j <= n; j++)
      if (i + j > 0) {
        if (i == 0)
          r = j - 1, res = (res - r * (m + 1) * (n - j + 1) * 6) % 1000000007;
        else if (j == 0)
          r = i - 1, res = (res - r * (n + 1) * (m - i + 1) * 6) % 1000000007;
        else
          r = gcd(i, j) - 1,
          res = (res - (((m - i + 1) * (n - j + 1)) % 1000000007) * r * 12) %
                1000000007;
      }
  cout << (res + 1000000007) % 1000000007;
  return 0;
}

### Prompt

Create a solution in CPP for the following 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

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
int m, n;
int xc, xl, yc, yl, c[2][2];
long long r, res, k1, k2;
bool ok(int x1, int y1, int x2, int y2, int x3, int y3) {
  return ((x1 - x2) * (y1 + y2) + (x2 - x3) * (y2 + y3) +
          (x3 - x1) * (y3 + y1)) %
             2 ==
         0;
}
int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
int main() {
  cin >> m >> n;
  xc = (m + 2) / 2;
  xl = (m + 1) / 2;
  yc = (n + 2) / 2;
  yl = (n + 1) / 2;
  c[0][0] = xc * yc;
  c[1][1] = xl * yl;
  c[0][1] = xc * yl;
  c[1][0] = xl * yc;
  res = 0;
  for (int x1 = 0; x1 <= 1; x1++)
    for (int y1 = 0; y1 <= 1; y1++)
      if (c[x1][y1] > 0) {
        k1 = c[x1][y1];
        c[x1][y1]--;
        for (int x2 = 0; x2 <= 1; x2++)
          for (int y2 = 0; y2 <= 1; y2++)
            if (c[x2][y2] > 0) {
              k2 = c[x2][y2];
              c[x2][y2]--;
              for (int x3 = 0; x3 <= 1; x3++)
                for (int y3 = 0; y3 <= 1; y3++)
                  if (c[x3][y3] > 0)
                    if (ok(x1, y1, x2, y2, x3, y3))
                      res = (res + c[x3][y3] * ((k1 * k2) % 1000000007)) %
                            1000000007;
              c[x2][y2]++;
            }
        c[x1][y1]++;
      }
  for (int i = 0; i <= m; i++)
    for (int j = 0; j <= n; j++)
      if (i + j > 0) {
        if (i == 0)
          r = j - 1, res = (res - r * (m + 1) * (n - j + 1) * 6) % 1000000007;
        else if (j == 0)
          r = i - 1, res = (res - r * (n + 1) * (m - i + 1) * 6) % 1000000007;
        else
          r = gcd(i, j) - 1,
          res = (res - (((m - i + 1) * (n - j + 1)) % 1000000007) * r * 12) %
                1000000007;
      }
  cout << (res + 1000000007) % 1000000007;
  return 0;
}

```