Problem: Professional sport is more than hard work. It also is the equipment, designed by top engineers. As an example, let's take tennis. Not only should you be in great shape, you also need an excellent racket! In this problem your task is to contribute to the development of tennis and to help to design a revolutionary new concept of a racket!

The concept is a triangular racket. Ant it should be not just any triangle, but a regular one. As soon as you've chosen the shape, you need to stretch the net. By the time you came the rocket had n holes drilled on each of its sides. The holes divide each side into equal n + 1 parts. At that, the m closest to each apex holes on each side are made for better ventilation only and you cannot stretch the net through them. The next revolutionary idea as to stretch the net as obtuse triangles through the holes, so that for each triangle all apexes lay on different sides. Moreover, you need the net to be stretched along every possible obtuse triangle. That's where we need your help — help us to count the number of triangles the net is going to consist of.

Two triangles are considered to be different if their pictures on the fixed at some position racket are different.

Input

The first and the only input line contains two integers n, m <image>.

Output

Print a single number — the answer to the problem.

Examples

Input

3 0


Output

9


Input

4 0


Output

24


Input

10 1


Output

210


Input

8 4


Output

0

Note

For the following picture n = 8, m = 2. White circles are the holes for ventilation, red circles — holes for net stretching. One of the possible obtuse triangles is painted red. 

<image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
struct pt {
  int x, y, z;
  pt() {}
  pt(int a, int b, int c) : x(a), y(b), z(c) {}
  inline pt operator+(const pt& o) const {
    return pt(x + o.x, y + o.y, z + o.z);
  }
  inline pt operator-(const pt& o) const {
    return pt(x - o.x, y - o.y, z - o.z);
  }
  inline pt operator*(const int& o) const { return pt(x * o, y * o, z * o); }
};
inline long long dp(const pt& a, const pt& b) {
  return (long long)a.x * b.x + (long long)a.y * b.y + (long long)a.z * b.z;
}
const int NMAX = 32300;
int n, m;
pt a, b, amb;
int amt[NMAX];
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m;
  pt dir(1, 1, 1);
  a = pt(-1, 0, 1);
  b = pt(-1, 1, 0);
  amb = a - b;
  for (int i = m + 1; i <= n / 2 + 1; ++i) {
    pt pi = b * (n + 1) + amb * i;
    int j = n - m;
    int k = m + 1;
    pt pj = a * j;
    pt pk = b * k;
    pt pji = pj - pi;
    pt pki = pk - pi;
    int cur = dp(pj - pi, pk - pi);
    int jd = -pji.x + pji.y;
    int kd = pki.x - pki.z;
    int jdlim = jd - (n - m) + (m + 1);
    int kdlim = kd - (n - m) + (m + 1);
    int ca = 0;
    for (; jd >= jdlim;) {
      while (cur >= 0 && kd >= kdlim) {
        cur += jd;
        kd--;
      }
      ca += kd;
      jd--;
      cur += kd;
    }
    amt[i] = ca + (n - 2 * m) * (1 - kdlim);
  }
  long long ans = 0;
  for (int i = 1; i <= n; ++i) {
    int v = min(i, n + 1 - i);
    ans += amt[v];
  }
  cout << ans * 3 << endl;
  return 0;
}