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 gd[4001][4001];
long long gcd(long long a, long long b) {
  if (a == 0) return b;
  return gd[b % a][a];
}
void getgcd() {
  for (int i = 0; i < 4001; i++)
    for (int j = i; j < 4001; j++) gd[j][i] = gd[i][j] = gcd(i, j);
}
long long count(long long x, long long y) {
  long long xe = (x - 1) >> 1;
  long long xo = x >> 1;
  long long ye = (y - 1) >> 1;
  long long yo = y >> 1;
  long long ans = 0;
  if ((x & 1) && (y & 1)) {
    ans += xo * yo;
  } else {
    ans += xo * ye;
    ans += xe * ye;
    ans += xe * yo;
  }
  ans *= 4;
  long long ans1 = 0;
  if ((x & 1) && (y & 1)) {
    ;
  } else
    ans1 += x + y - 2;
  if (y & 1) {
    if (x & 1)
      ans1 += xo << 1;
    else
      ans1 += xe << 1;
  } else {
    ans1 += (x - 1) << 1;
  }
  if (x & 1) {
    if (y & 1)
      ans1 += yo << 1;
    else
      ans1 += ye << 1;
  } else {
    ans1 += (y - 1) << 1;
  }
  ans1 *= 2;
  long long ans4 = 0;
  if (x & 1) {
    if (y & 1) {
      ans4 = xo * yo + xe * ye;
    } else {
      ans4 = (x - 1) * ye;
    }
  } else {
    if (y & 1) {
      ans4 = (y - 1) * xe;
    } else {
      ans4 = (x - 1) * (y - 1);
    }
  }
  ans4 -= gd[x][y] - 1;
  ans4 *= 2;
  ans += ans1;
  ans += ans4;
  if (!((x & 1) && (y & 1))) ans += 4;
  ans %= 1000000007;
  return ans;
}
int main() {
  getgcd();
  long long n, m;
  cin >> n >> m;
  long long ans = 0;
  for (long long i = 1; i <= n; i++)
    for (long long j = 1; j <= m; j++) {
      ans += (n + 1 - i) * (m + 1 - j) * count(i, j);
      ans %= 1000000007;
    }
  cout << (6 * ans) % 1000000007 << endl;
  return 0;
}