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 MOD = 1000000007;
int power(int a, int b, int ans = 1) {
  for (; b; b >>= 1, a = (long long)a * a % MOD)
    if (b & 1) ans = (long long)ans * a % MOD;
  return ans;
}
int g[4040][4040];
int main() {
  int w, h;
  cin >> w >> h;
  int inv2 = power(2, MOD - 2), inv3 = power(3, MOD - 2);
  long long cnt = (w + 1) * (h + 1);
  function<long long(long long)> C = [](long long n) {
    return n * (n - 1) % MOD * (n - 2) % MOD;
  };
  long long ans = -C(h + 1) * (w + 1) - C(w + 1) * (h + 1);
  int ct[4];
  ct[0] = (w + 1 >> 1) * (h + 1 >> 1);
  ct[1] = (w + 1 >> 1) * (h + 2 >> 1);
  ct[2] = (w + 2 >> 1) * (h + 1 >> 1);
  ct[3] = (w + 2 >> 1) * (h + 2 >> 1);
  for (int i = 0; i < 4; i++) ans += C(ct[i]);
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
      if (i != j) ans += 3LL * ct[i] * (ct[i] - 1) % MOD * ct[j] % MOD;
  for (int i = 0; i <= w; i++)
    for (int j = 0; j <= h; j++) {
      if (!i)
        g[i][j] = j;
      else if (!j)
        g[i][j] = i;
      else {
        if (i > j)
          g[i][j] = g[i % j][j];
        else
          g[i][j] = g[i][j % i];
        ans -= (g[i][j] - 1LL) * (w - i + 1) * (h - j + 1) * 12LL % MOD;
      }
    }
  cout << (ans % MOD + MOD) % MOD << endl;
  return 0;
}