Problem: Alex enjoys performing magic tricks. He has a trick that requires a deck of n cards. He has m identical decks of n different cards each, which have been mixed together. When Alex wishes to perform the trick, he grabs n cards at random and performs the trick with those. The resulting deck looks like a normal deck, but may have duplicates of some cards.

The trick itself is performed as follows: first Alex allows you to choose a random card from the deck. You memorize the card and put it back in the deck. Then Alex shuffles the deck, and pulls out a card. If the card matches the one you memorized, the trick is successful.

You don't think Alex is a very good magician, and that he just pulls a card randomly from the deck. Determine the probability of the trick being successful if this is the case.

Input

First line of the input consists of two integers n and m (1 ≤ n, m ≤ 1000), separated by space — number of cards in each deck, and number of decks.

Output

On the only line of the output print one floating point number – probability of Alex successfully performing the trick. Relative or absolute error of your answer should not be higher than 10 - 6.

Examples

Input

2 2


Output

0.6666666666666666


Input

4 4


Output

0.4000000000000000


Input

1 2


Output

1.0000000000000000

Note

In the first sample, with probability <image> Alex will perform the trick with two cards with the same value from two different decks. In this case the trick is guaranteed to succeed.

With the remaining <image> probability he took two different cards, and the probability of pulling off the trick is <image>.

The resulting probability is <image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int f = 1, x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') f = (ch == '-') ? -1 : 1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return f * x;
}
const int MAXN = 1e6 + 5;
int n, m;
unordered_map<int, int> fac;
int mindiv[MAXN];
void add(int k, int o) {
  while (mindiv[k]) {
    int f = mindiv[k];
    k /= f, fac[f] += o;
  }
}
void addC(int n, int m, int o) {
  for (int i = (m + 1); i < (n + 1); ++i) add(i, 1 * o);
  for (int i = (2); i < (n - m + 1); ++i) add(i, -1 * o);
}
bool notP[MAXN];
int p[MAXN], tot;
void init() {
  for (int i = (2); i < (MAXN); ++i) {
    if (!notP[i]) p[tot++] = i, mindiv[i] = i;
    for (int j = (0); j < (tot); ++j) {
      int k = p[j] * i;
      if (k >= MAXN) break;
      mindiv[k] = p[j], notP[k] = 1;
      if (i % p[j] == 0) break;
    }
  }
}
int main() {
  init();
  n = read(), m = read();
  if (n == 0 || m == 0) {
    puts("0");
    return 0;
  }
  add(n, 1), add(m, 1), addC(n * m - 1, n - 1, 1);
  add(n, -1), add(n, -1), addC(n * m, n, -1);
  double ans1 = 1;
  for (int i = (2); i < (MAXN); ++i) {
    int k = fac[i];
    if (k > 0) {
      while (k--) ans1 *= i;
    } else if (k < 0) {
      while (k++) ans1 /= i;
    }
  }
  fac.clear();
  double ans2 = 1;
  if (n >= 2 && n * m - 2 > 0 && m >= 2) {
    add(2, 1), add(n, 1), addC(m, 2, 1), addC(n * m - 2, n - 2, 1);
    add(n, -1), add(n, -1), addC(n * m, n, -1);
    for (int i = (2); i < (MAXN); ++i) {
      int k = fac[i];
      if (k > 0) {
        while (k--) ans2 *= i;
      } else if (k < 0) {
        while (k++) ans2 /= i;
      }
    }
  } else
    ans2 = 0;
  printf("%.7f\n", ans1 + ans2);
  return 0;
}