#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using std::bitset;
using namespace std;
long long g[4010][4010];
long long n, m, ans;
int main() {
  long long i, j, tem;
  long long a, b, c, d;
  while (scanf("%I64d%I64d", &n, &m) != EOF) {
    for (i = 0; i <= n; i++)
      for (j = 0; j <= m; j++)
        if (i && j)
          g[i][j] = i > j ? g[i - j][j] : g[i][j - i];
        else
          g[i][j] = i + j;
    tem = (n + 1) * (m + 1);
    ans = tem * (tem - 1) % 1000000007 * (tem - 2) % 1000000007;
    a = (n / 2 + 1) * (m / 2 + 1);
    b = (n + 1) / 2 * (m / 2 + 1);
    c = (n / 2 + 1) * ((m + 1) / 2);
    d = (n + 1) / 2 * ((m + 1) / 2);
    ans -= 6 * a * b % 1000000007 * c % 1000000007;
    ans -= 6 * b * c % 1000000007 * d % 1000000007;
    ans -= 6 * c * d % 1000000007 * a % 1000000007;
    ans -= 6 * d * a % 1000000007 * b % 1000000007;
    ans = (ans + 1000000007) % 1000000007;
    for (i = 0; i <= n; i++)
      for (j = 0; j <= m; j++)
        if (g[i][j] > 1) {
          tem = (i == 0 || j == 0) ? 6 : 12;
          ans = (ans - (g[i][j] - 1) * tem * (n + 1 - i) * (m + 1 - j)) %
                1000000007;
        }
    ans = (ans + 1000000007) % 1000000007;
    printf("%I64d\n", ans);
  }
  return 0;
}

### Prompt

Develop a solution in CPP to the problem described below:

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:102400000,102400000")
using std::bitset;
using namespace std;
long long g[4010][4010];
long long n, m, ans;
int main() {
  long long i, j, tem;
  long long a, b, c, d;
  while (scanf("%I64d%I64d", &n, &m) != EOF) {
    for (i = 0; i <= n; i++)
      for (j = 0; j <= m; j++)
        if (i && j)
          g[i][j] = i > j ? g[i - j][j] : g[i][j - i];
        else
          g[i][j] = i + j;
    tem = (n + 1) * (m + 1);
    ans = tem * (tem - 1) % 1000000007 * (tem - 2) % 1000000007;
    a = (n / 2 + 1) * (m / 2 + 1);
    b = (n + 1) / 2 * (m / 2 + 1);
    c = (n / 2 + 1) * ((m + 1) / 2);
    d = (n + 1) / 2 * ((m + 1) / 2);
    ans -= 6 * a * b % 1000000007 * c % 1000000007;
    ans -= 6 * b * c % 1000000007 * d % 1000000007;
    ans -= 6 * c * d % 1000000007 * a % 1000000007;
    ans -= 6 * d * a % 1000000007 * b % 1000000007;
    ans = (ans + 1000000007) % 1000000007;
    for (i = 0; i <= n; i++)
      for (j = 0; j <= m; j++)
        if (g[i][j] > 1) {
          tem = (i == 0 || j == 0) ? 6 : 12;
          ans = (ans - (g[i][j] - 1) * tem * (n + 1 - i) * (m + 1 - j)) %
                1000000007;
        }
    ans = (ans + 1000000007) % 1000000007;
    printf("%I64d\n", ans);
  }
  return 0;
}

```