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;
inline int ADD(int a, int b) {
  a += b;
  if (a >= 1000000007) a -= 1000000007;
  return (int)a;
}
inline void ADDTO(int &a, int b) {
  a += b;
  if (a >= 1000000007) a -= 1000000007;
}
inline void SUBTO(int &a, int b) {
  a -= b;
  if (a < 0) a += 1000000007;
}
inline int MUL(int a, int b) { return (int)((long long)a * b % 1000000007); }
int cnt[2][2], g[4010][4010];
int gcd(int a, int b) {
  if (g[a][b] >= 0) return g[a][b];
  int &ret = g[a][b];
  if (b == 0) return ret = a;
  return ret = gcd(b, a % b);
}
int main() {
  memset(g, -1, sizeof(g));
  int w, h;
  while (scanf("%d%d", &w, &h) == 2) {
    ++w;
    ++h;
    int ans = 0, zero = 0;
    for (int x = 0; x < (2); ++x)
      for (int y = 0; y < (2); ++y)
        cnt[x][y] = ((w + (x == 0)) / 2) * ((h + (y == 0)) / 2);
    for (int x1 = 0; x1 < (2); ++x1)
      for (int y1 = 0; y1 < (2); ++y1)
        for (int x2 = 0; x2 < (2); ++x2)
          for (int y2 = 0; y2 < (2); ++y2)
            for (int x3 = 0; x3 < (2); ++x3)
              for (int y3 = 0; y3 < (2); ++y3) {
                int area = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
                if (area % 2 == 0)
                  ADDTO(ans, MUL(cnt[x1][y1], MUL(cnt[x2][y2], cnt[x3][y3])));
              }
    ADDTO(zero, w * h);
    ADDTO(zero, MUL(w * h * 3, w * h - 1));
    ADDTO(zero, MUL(w * (w - 1), (w - 2) * h));
    ADDTO(zero, MUL(h * (h - 1), (h - 2) * w));
    for (int x = (1); x <= (w - 1); ++x)
      for (int y = (1); y <= (h - 1); ++y)
        if (gcd(x, y) > 1) {
          int seg = MUL((w - x) * (h - y), (gcd(x, y) - 1) * 12);
          ADDTO(zero, seg);
        }
    SUBTO(ans, zero);
    printf("%d\n", ans);
  }
}