#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:66777216")
using namespace std;
int a, b, c, d, i, j, n, m, k, w, h;
inline int take(int mask, int pos) { return (mask >> pos) & 1; }
inline int cnt(int w, int p) {
  if (w % 2 == 1) return (w + 1) / 2;
  if (w % 2 == p % 2)
    return w / 2 + 1;
  else
    return w / 2;
}
inline int gcd(int a, int b) {
  for (; b; swap(a, b)) a %= b;
  return a;
}
int main() {
  scanf("%d%d", &w, &h);
  int ans = 0;
  for (int _n((1 << 6) - 1), mask(0); mask <= _n; mask++) {
    int x1 = take(mask, 0);
    int y1 = take(mask, 1);
    int x2 = take(mask, 2);
    int y2 = take(mask, 3);
    int x3 = take(mask, 4);
    int y3 = take(mask, 5);
    int val = x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 + x3 * y1 - x1 * y3;
    if (val % 2) continue;
    int add = (long long)cnt(w, x1) * (long long)cnt(w, x2) *
              (long long)cnt(w, x3) % 1000000007;
    add = (long long)add * cnt(h, y1) * (long long)cnt(h, y2) *
          (long long)cnt(h, y3) % 1000000007;
    ans += add;
    if (ans >= 1000000007) ans -= 1000000007;
  }
  ans = (ans - (long long)(w + 1) * (h + 1)) % 1000000007;
  if (ans < 0) ans += 1000000007;
  for (int _n((w + 1) - 1), first(0); first <= _n; first++) {
    for (int _n(h), second(-h); second <= _n; second++) {
      if (!first && second <= 0) continue;
      int g = gcd(first, abs(second));
      ans = (ans - 6LL * g * (w - first + 1) * (h - abs(second) + 1)) %
            1000000007;
      if (ans < 0) ans += 1000000007;
    }
  }
  cout << ans << endl;
}

### 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>
#pragma comment(linker, "/STACK:66777216")
using namespace std;
int a, b, c, d, i, j, n, m, k, w, h;
inline int take(int mask, int pos) { return (mask >> pos) & 1; }
inline int cnt(int w, int p) {
  if (w % 2 == 1) return (w + 1) / 2;
  if (w % 2 == p % 2)
    return w / 2 + 1;
  else
    return w / 2;
}
inline int gcd(int a, int b) {
  for (; b; swap(a, b)) a %= b;
  return a;
}
int main() {
  scanf("%d%d", &w, &h);
  int ans = 0;
  for (int _n((1 << 6) - 1), mask(0); mask <= _n; mask++) {
    int x1 = take(mask, 0);
    int y1 = take(mask, 1);
    int x2 = take(mask, 2);
    int y2 = take(mask, 3);
    int x3 = take(mask, 4);
    int y3 = take(mask, 5);
    int val = x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 + x3 * y1 - x1 * y3;
    if (val % 2) continue;
    int add = (long long)cnt(w, x1) * (long long)cnt(w, x2) *
              (long long)cnt(w, x3) % 1000000007;
    add = (long long)add * cnt(h, y1) * (long long)cnt(h, y2) *
          (long long)cnt(h, y3) % 1000000007;
    ans += add;
    if (ans >= 1000000007) ans -= 1000000007;
  }
  ans = (ans - (long long)(w + 1) * (h + 1)) % 1000000007;
  if (ans < 0) ans += 1000000007;
  for (int _n((w + 1) - 1), first(0); first <= _n; first++) {
    for (int _n(h), second(-h); second <= _n; second++) {
      if (!first && second <= 0) continue;
      int g = gcd(first, abs(second));
      ans = (ans - 6LL * g * (w - first + 1) * (h - abs(second) + 1)) %
            1000000007;
      if (ans < 0) ans += 1000000007;
    }
  }
  cout << ans << endl;
}

```