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;
bool debug = false;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int p[2][2];
int gcd11(int x, int y) {
  int z = y;
  while (x % y != 0) {
    z = x % y;
    x = y;
    y = z;
  }
  return z;
}
int main() {
  int w, h;
  scanf("%d%d", &w, &h);
  long long ans = 0;
  for (int(i) = 0; (i) < (int)(w + 1); (i)++)
    for (int(j) = 0; (j) < (int)(h + 1); (j)++) {
      p[i % 2][j % 2]++;
      if (i && j) {
        int c = gcd11(i, j);
        ans += 1000000007 - 12LL * (w + 1 - i) * (h + 1 - j) * (c - 1);
      }
    }
  ans += 1000000007 - (long long)(w + 1) * (h + 1) * h * (h - 1) % 1000000007;
  ans += 1000000007 - (long long)(h + 1) * (w + 1) * w * (w - 1) % 1000000007;
  long long x = (long long)(w + 1) * (h + 1);
  ans += x * (x - 1) * (x - 2) % 1000000007;
  ans += 1000000007 - x * x * x % 1000000007;
  for (int(a) = 0; (a) < (int)(2); (a)++)
    for (int(b) = 0; (b) < (int)(2); (b)++)
      for (int(c) = 0; (c) < (int)(2); (c)++)
        for (int(d) = 0; (d) < (int)(2); (d)++)
          for (int(f) = 0; (f) < (int)(2); (f)++)
            for (int(e) = 0; (e) < (int)(2); (e)++) {
              int aa = c - a, bb = d - b;
              int cc = e - a, dd = f - b;
              if ((aa * dd - bb * cc) % 2 == 0)
                ans += (long long)p[a][b] * p[c][d] % 1000000007 * p[e][f] %
                       1000000007;
            }
  printf("%lld\n", ans % 1000000007);
  return 0;
}