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;
int abs(int x) { return (x < 0) ? -x : x; }
const int N = 4050;
const long long MOD = 1000 * 1000 * 1000 + 7;
long long cnt[2][2];
int _gcd[N][N];
int gcd(int a, int b) {
  if (_gcd[a][b] != -1) return _gcd[a][b];
  if (b == 0)
    return _gcd[a][b] = a;
  else
    return _gcd[a][b] = gcd(b, a % b);
}
int main() {
  memset(_gcd, -1, sizeof(_gcd));
  int w, h;
  scanf("%d %d", &w, &h);
  for (int y = 0; y <= h; y++)
    for (int x = 0; x <= w; x++) cnt[y & 1][x & 1]++;
  long long good = 0;
  for (int msk = 0; msk < 64; msk++) {
    int x[6];
    for (int i = 0; i < 6; i++) x[i] = (msk >> i) & 1;
    int s = x[0] * x[3] - x[1] * x[2] + x[2] * x[5] - x[3] * x[4] +
            x[4] * x[1] - x[5] * x[0];
    if (s % 2 == 0)
      good = (good +
              (((cnt[x[0]][x[1]] * cnt[x[2]][x[3]]) % MOD) * cnt[x[4]][x[5]]) %
                  MOD) %
             MOD;
  }
  good -= (w + 1) * (h + 1);
  long long q = ((w + 1) * (h + 1));
  long long q2 = q - 1;
  good -= ((q * q2) * 3) % MOD;
  for (int vx = 0; vx <= w; vx++) {
    for (int vy = (vx == 0) ? 1 : -h; vy <= h; vy++) {
      if (vy == 0 && vx == 0) continue;
      long long num = gcd(vx, abs(vy)) - 1;
      good = (good - 6 * num * (h - abs(vy) + 1) * (w - vx + 1)) % MOD;
    }
  }
  good %= MOD;
  good += MOD;
  good %= MOD;
  printf("%d\n", (int)good);
}