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;
const int INF = 2147483647;
const long long LLINF = 9223372036854775807LL;
const int mod = 1000000007;
int cx[2] = {};
int cy[2] = {};
int gcd(int x, int y) { return x ? gcd(y % x, x) : y; }
const int maxn = 4010;
int g[maxn][maxn] = {};
int main() {
  for (int i = 0; i < maxn; ++i) g[i][0] = g[0][i] = i;
  for (int i = 1; i < maxn; ++i)
    for (int j = i; j < maxn; ++j) g[i][j] = g[j][i] = g[j - i][i];
  int w, h;
  scanf("%d%d", &w, &h);
  for (int i = 0; i <= w; ++i) cx[i % 2]++;
  for (int i = 0; i <= h; ++i) cy[i % 2]++;
  int ans = 0;
  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) {
              if (((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) % 2 == 0)
                ans = (ans + ((1LL * cx[x1] * cy[y1] % mod) *
                              (cx[x2] * cy[y2] % mod) % mod) *
                                 (cx[x3] * cy[y3])) %
                      mod;
            }
  ans = (ans + mod - (w + 1) * (h + 1)) % mod;
  for (int i = 0; i <= w; ++i)
    for (int j = 0; j <= h; ++j) {
      if (i == 0 && j == 0) continue;
      int curcnt = 6 * (g[i][j] - 1) + 6;
      if (i && j) curcnt *= 2;
      curcnt = (long long)curcnt * (w - i + 1) * (h - j + 1) % mod;
      ans = (ans + mod - curcnt) % mod;
    }
  printf("%d\n", ans);
  return 0;
}