#include <bits/stdc++.h>
using namespace std;
long long ans = 0;
int n, m, s[6];
int gcd(int i, int j) { return j ? gcd(j, i % j) : i; }
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < (1 << 6); i++) {
    long long cur = 1;
    for (int j = 0; j < 6; j++) s[j] = (i & (1 << j)) > 0;
    if ((s[0] * s[3] + s[0] * s[5] + s[2] * s[1] + s[2] * s[5] + s[4] * s[1] +
         s[4] * s[3]) &
        1)
      continue;
    for (int j = 0; j < 6; j += 2) {
      if ((s[j] % 2 == 0) && (n % 2 == 0))
        cur = (cur * (n / 2 + 1)) % 1000000007;
      else
        cur = (cur * ((n + 1) / 2)) % 1000000007;
    }
    for (int j = 1; j < 6; j += 2) {
      if ((s[j] % 2 == 0) && (m % 2 == 0))
        cur = (cur * (m / 2 + 1)) % 1000000007;
      else
        cur = (cur * ((m + 1) / 2)) % 1000000007;
    }
    ans = (ans + cur) % 1000000007;
  }
  ans = (ans - (n + 1) * (m + 1)) % 1000000007;
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= m; j++) {
      long long cur = gcd(i, j);
      long long minus = (n + 1 - i) * (m + 1 - j) * cur * 6 % 1000000007;
      if (i * j) minus *= 2;
      ans = (ans - minus) % 1000000007;
    }
  }
  if (ans < 0) ans += 1000000007;
  printf("%I64d\n", ans);
  return 0;
}

### Prompt

Construct a Cpp code solution to the problem outlined:

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;
long long ans = 0;
int n, m, s[6];
int gcd(int i, int j) { return j ? gcd(j, i % j) : i; }
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < (1 << 6); i++) {
    long long cur = 1;
    for (int j = 0; j < 6; j++) s[j] = (i & (1 << j)) > 0;
    if ((s[0] * s[3] + s[0] * s[5] + s[2] * s[1] + s[2] * s[5] + s[4] * s[1] +
         s[4] * s[3]) &
        1)
      continue;
    for (int j = 0; j < 6; j += 2) {
      if ((s[j] % 2 == 0) && (n % 2 == 0))
        cur = (cur * (n / 2 + 1)) % 1000000007;
      else
        cur = (cur * ((n + 1) / 2)) % 1000000007;
    }
    for (int j = 1; j < 6; j += 2) {
      if ((s[j] % 2 == 0) && (m % 2 == 0))
        cur = (cur * (m / 2 + 1)) % 1000000007;
      else
        cur = (cur * ((m + 1) / 2)) % 1000000007;
    }
    ans = (ans + cur) % 1000000007;
  }
  ans = (ans - (n + 1) * (m + 1)) % 1000000007;
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= m; j++) {
      long long cur = gcd(i, j);
      long long minus = (n + 1 - i) * (m + 1 - j) * cur * 6 % 1000000007;
      if (i * j) minus *= 2;
      ans = (ans - minus) % 1000000007;
    }
  }
  if (ans < 0) ans += 1000000007;
  printf("%I64d\n", ans);
  return 0;
}

```