#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007LL;
int w, h;
int x[3], y[3];
long long ans = 0;
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int main() {
  scanf("%d%d", &w, &h);
  w++, h++;
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      long long sx = 1, sy = 1;
      for (int k = 0; k < 3; k++) {
        x[k] = (i & (1 << k)) != 0;
        y[k] = (j & (1 << k)) != 0;
        sx = sx * ((w + 1 - x[k]) / 2) % MOD;
        sy = sy * ((h + 1 - y[k]) / 2) % MOD;
      }
      int t =
          x[0] * (y[1] - y[2]) + x[1] * (y[2] - y[0]) + x[2] * (y[0] - y[1]);
      if (t % 2 == 0) ans = (ans + sx * sy) % MOD;
    }
  }
  long long t = w * h;
  ans = (ans - t - t * (t - 1) * 3) % MOD;
  ans = (ans - t * (h - 1) * (h - 2) % MOD - t * (w - 1) * (w - 2) % MOD) % MOD;
  for (int i = 1; i < w; i++)
    for (int j = 1; j < h; j++)
      ans -= (long long)(gcd(i, j) - 1) * (w - i) * (h - j) * 12 % MOD;
  ans = (ans % MOD + MOD) % MOD;
  printf("%I64d\n", ans);
  return 0;
}

### Prompt

Please formulate a cpp solution to 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;
const long long MOD = 1000000007LL;
int w, h;
int x[3], y[3];
long long ans = 0;
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int main() {
  scanf("%d%d", &w, &h);
  w++, h++;
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      long long sx = 1, sy = 1;
      for (int k = 0; k < 3; k++) {
        x[k] = (i & (1 << k)) != 0;
        y[k] = (j & (1 << k)) != 0;
        sx = sx * ((w + 1 - x[k]) / 2) % MOD;
        sy = sy * ((h + 1 - y[k]) / 2) % MOD;
      }
      int t =
          x[0] * (y[1] - y[2]) + x[1] * (y[2] - y[0]) + x[2] * (y[0] - y[1]);
      if (t % 2 == 0) ans = (ans + sx * sy) % MOD;
    }
  }
  long long t = w * h;
  ans = (ans - t - t * (t - 1) * 3) % MOD;
  ans = (ans - t * (h - 1) * (h - 2) % MOD - t * (w - 1) * (w - 2) % MOD) % MOD;
  for (int i = 1; i < w; i++)
    for (int j = 1; j < h; j++)
      ans -= (long long)(gcd(i, j) - 1) * (w - i) * (h - j) * 12 % MOD;
  ans = (ans % MOD + MOD) % MOD;
  printf("%I64d\n", ans);
  return 0;
}

```