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

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int chh;
const long long N = 4005, MOD = 1000000007;
long long n, m;
int gcd[N][N];
inline long long C(long long n, long long f) {
  if (f % 2) return (n + 1) / 2;
  return n / 2 + 1;
}
inline void A(long long &x, long long y) { x = (x + y) % MOD; }
inline long long M(long long x, long long y) { return x * y % MOD; }
int main() {
  long long res, d, r, tmp;
  while (cin >> n >> m) {
    res = 0;
    for (int x = 0; x <= 1; x++)
      for (int y = 0; y <= 1; y++)
        for (int x1 = 0; x1 <= 1; x1++)
          for (int y1 = 0; y1 <= 1; y1++)
            for (int x2 = 0; x2 <= 1; x2++)
              for (int y2 = 0; y2 <= 1; y2++) {
                if (((x1 - x) * (y2 - y) - (x2 - x) * (y1 - y)) % 2) continue;
                A(res, M(M(C(n, x) * C(m, y), C(n, x1) * C(m, y1)),
                         C(n, x2) * C(m, y2)));
              }
    d = max(n, m);
    for (int i = 0; i <= d; i++)
      for (int j = 0; j <= i; j++) gcd[i][j] = j ? gcd[j][i % j] : i;
    for (int i = 0; i <= d; i++)
      for (int j = i + 1; j <= d; j++) gcd[i][j] = gcd[j][i];
    r = 0;
    A(r, (n + 1) * (m + 1));
    for (int x = 0; x <= n; x++)
      for (int y = 0; y <= m; y++) {
        if (!x && !y) continue;
        tmp = 6LL * gcd[x][y] * (n - x + 1) * (m - y + 1);
        A(r, tmp);
        if (!x || !y) continue;
        A(r, tmp);
      }
    cout << (res - r + MOD) % MOD << endl;
    ;
  }
  return 0;
}