#include <bits/stdc++.h>
using namespace std;
const int MOD = (int)1e9 + 7;
inline long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
int main() {
  long long w, h;
  while (scanf("%lld"
               "%lld",
               &w, &h) >= 1) {
    w++, h++;
    long long ans = w * w * w % MOD;
    ans = ans * ((h * h * h) % MOD) % MOD;
    int ar[6];
    for (int mask = 0; mask < (1 << 6); mask++) {
      for (int i = 0; i < 6; i++) ar[i] = ((mask >> i) & 1);
      if (((ar[1] ^ ar[0]) & (ar[4] ^ ar[3])) ^
          ((ar[2] ^ ar[0]) & (ar[5] ^ ar[3]))) {
        long long todif = 1;
        for (int j = 0; j < 3; j++) todif = todif * ((w + !ar[j]) / 2) % MOD;
        for (int j = 0; j < 3; j++)
          todif = todif * ((h + !ar[j + 3]) / 2) % MOD;
        ans -= todif;
        ans = ans % MOD;
      }
    }
    ans -= w * h;
    ans -= w * h * (w * h - 1) / 2 * 3 * 2;
    ans %= MOD;
    for (long long y = 0; y < h; y++) {
      for (long long x = !y; x < w; x++) {
        ans -= ((x && y) ? 2 : 1) * (gcd(x, y) - 1) * 6 * (h - y) * (w - x);
        ans %= MOD;
      }
    }
    if (ans < 0) ans += MOD;
    printf("%d\n", (int)ans);
  }
  return 0;
}

### Prompt

Generate 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 int MOD = (int)1e9 + 7;
inline long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
int main() {
  long long w, h;
  while (scanf("%lld"
               "%lld",
               &w, &h) >= 1) {
    w++, h++;
    long long ans = w * w * w % MOD;
    ans = ans * ((h * h * h) % MOD) % MOD;
    int ar[6];
    for (int mask = 0; mask < (1 << 6); mask++) {
      for (int i = 0; i < 6; i++) ar[i] = ((mask >> i) & 1);
      if (((ar[1] ^ ar[0]) & (ar[4] ^ ar[3])) ^
          ((ar[2] ^ ar[0]) & (ar[5] ^ ar[3]))) {
        long long todif = 1;
        for (int j = 0; j < 3; j++) todif = todif * ((w + !ar[j]) / 2) % MOD;
        for (int j = 0; j < 3; j++)
          todif = todif * ((h + !ar[j + 3]) / 2) % MOD;
        ans -= todif;
        ans = ans % MOD;
      }
    }
    ans -= w * h;
    ans -= w * h * (w * h - 1) / 2 * 3 * 2;
    ans %= MOD;
    for (long long y = 0; y < h; y++) {
      for (long long x = !y; x < w; x++) {
        ans -= ((x && y) ? 2 : 1) * (gcd(x, y) - 1) * 6 * (h - y) * (w - x);
        ans %= MOD;
      }
    }
    if (ans < 0) ans += MOD;
    printf("%d\n", (int)ans);
  }
  return 0;
}

```