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 N, M;
long long mod = 1000000007;
int gcd(int a, int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
int main() {
  int i, j, k;
  long long a, b, s, u, v;
  scanf("%d%d", &N, &M);
  s = 0;
  for (i = 1; i <= N; i++) {
    for (j = 1; j <= M; j++) {
      a = i / 2;
      b = j / 2;
      if (i % 2 == 0 && j % 2 == 0) {
        u = 12 * a * b + 4 * a + 4 * b - 4;
        v = (2 * a - 1) * (2 * b - 1) - (gcd(i, j) - 1);
        u += 2 * v;
        s += u * (N + 1 - i) * (M + 1 - j);
      } else if (i % 2 == 0 && j % 2 == 1) {
        u = (12 * a * b + 4 * a + 4 * b + 4 * a - 2);
        v = (a - 1) * (2 * b) - (gcd(i, j) - 1);
        u += 2 * v;
        s += u * (N + 1 - i) * (M + 1 - j);
      } else if (i % 2 == 1 && j % 2 == 0) {
        u = (12 * a * b + 4 * b + 4 * a + 4 * b - 2);
        v = (2 * a) * (b - 1) - (gcd(i, j) - 1);
        u += 2 * v;
        s += u * (N + 1 - i) * (M + 1 - j);
      } else {
        u = 4 * a * b + 4 * a + 4 * b;
        v = 2 * a * b - (gcd(i, j) - 1);
        u += 2 * v;
        s += u * (N + 1 - i) * (M + 1 - j);
      }
      s %= mod;
    }
  }
  s *= 6;
  s %= mod;
  printf("%I64d\n", s);
  return 0;
}