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 long long Mod = 1000000007;
const long long MAX = 4000 + 10;
long long w, h;
long long sum[5], g[MAX][MAX], f[MAX][MAX];
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long chaji(long long a, long long b, long long c, long long d, long long e,
                long long f) {
  return (c - a) * (f - b) - (e - a) * (d - b);
}
int main() {
  long long i, j, k, a, b, c, ans = 0;
  cin >> w >> h;
  for (i = 0; i <= w; ++i)
    for (j = 0; j <= h; ++j) ++sum[(i % 2) * 2 + (j % 2)];
  for (i = 0; i < 4; ++i)
    for (j = 0; j < 4; ++j)
      for (k = 0; k < 4; ++k) {
        if ((chaji(i / 2, i % 2, j / 2, j % 2, k / 2, k % 2)) % 2 == 0) {
          a = sum[i];
          b = sum[j];
          c = sum[k];
          if (i == j && j == k)
            b -= 1, c -= 2;
          else if (i == j)
            --b;
          else if (i == k)
            --c;
          else if (k == j)
            --c;
          ans = (ans + a * b % Mod * c % Mod) % Mod;
        }
      }
  for (i = 1; i <= w; ++i)
    for (j = 1; j <= h; ++j) {
      long long p = gcd(i, j) - 1;
      g[i][j] = (g[i - 1][j] + g[i][j - 1] + Mod - g[i - 1][j - 1] +
                 (p > 0) * p * 6) %
                Mod;
      f[i][j] =
          (f[i][j - 1] + f[i - 1][j] - f[i - 1][j - 1] + Mod + g[i][j] * 2) %
          Mod;
    }
  ans = (ans - f[w][h] + Mod) % Mod;
  if (w + 1 >= 3)
    ans = (ans + Mod - (w + 1) * w % Mod * (w - 1) % Mod * (h + 1) % Mod) % Mod;
  if (h + 1 >= 3)
    ans = (ans + Mod - (h + 1) * h % Mod * (h - 1) % Mod * (w + 1) % Mod) % Mod;
  cout << ans << endl;
}