Problem: Shrek and the Donkey (as you can guess, they also live in the far away kingdom) decided to play a card game called YAGame. The rules are very simple: initially Shrek holds m cards and the Donkey holds n cards (the players do not see each other's cards), and one more card lies on the table face down so that both players cannot see it as well. Thus, at the beginning of the game there are overall m + n + 1 cards. Besides, the players know which cards the pack of cards consists of and their own cards (but they do not know which card lies on the table and which ones the other player has). The players move in turn and Shrek starts. During a move a player can:

  * Try to guess which card is lying on the table. If he guesses correctly, the game ends and he wins. If his guess is wrong, the game also ends but this time the other player wins.
  * Name any card from the pack. If the other player has such card, he must show it and put it aside (so that this card is no longer used in the game). If the other player doesn't have such card, he says about that.

Recently Donkey started taking some yellow pills and winning over Shrek. Now Shrek wants to evaluate his chances to win if he too starts taking the pills.

Help Shrek assuming the pills are good in quality and that both players using them start playing in the optimal manner.

Input

The first line contains space-separated integers m and n (0 ≤ m, n ≤ 1000).

Output

Print space-separated probabilities that Shrek wins and Donkey wins correspondingly; the absolute error should not exceed 10 - 9.

Examples

Input

0 3


Output

0.25 0.75


Input

1 0


Output

1 0


Input

1 1


Output

0.5 0.5

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void in(T &x) {
  x = 0;
  char c = getchar();
  bool f = 0;
  while (!isdigit(c)) f |= (c == '-'), c = getchar();
  while (isdigit(c)) x = x * 10 + (c ^ '0'), c = getchar();
  f ? x = -x : 0;
}
template <class T>
inline void out(T x, const char c = '\n') {
  static short st[30];
  short m = 0;
  if (x < 0) putchar('-'), x = -x;
  do st[++m] = x % 10, x /= 10;
  while (x);
  while (m) putchar(st[m--] | '0');
  putchar(c);
}
template <class T, class... Args>
inline void in(T &x, Args &...args) {
  in(x);
  in(args...);
}
template <class T, class... Args>
inline void out(const T &x, const Args &...args) {
  out(x, ' ');
  out(args...);
}
template <class T>
inline void prt(T a[], int n) {
  for (register int i = 0; i < n; ++i) out(a[i], i == n - 1 ? '\n' : ' ');
}
template <class T>
inline void clr(T a[], int n) {
  memset(a, 0, sizeof(T) * n);
}
template <class T>
inline void clr(T *a, T *b) {
  memset(a, 0, sizeof(T) * (b - a));
}
template <class T>
inline bool ckmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <class T>
inline bool ckmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
namespace i207M {
double f[1005][1005];
double dp(int n, int m) {
  if (!m) return 1;
  if (!n) return 1.0 / (m + 1);
  double &r = f[n][m];
  if (r > -1) return r;
  double k0 = (1 - dp(m - 1, n)) * m / (m + 1) - 1, b0 = 1;
  double k1 = ((1 - dp(m - 1, n)) * m + 1) / (m + 1) - (1 - dp(m, n - 1)),
         b1 = 1 - dp(m, n - 1);
  r = (b1 - b0) / (k0 - k1);
  return r = k0 * r + b0;
}
signed main() {
  int n, m;
  in(n, m);
  for (register int i = 1, ir = max(n, m); i <= ir; ++i)
    for (register int j = 1; j <= ir; ++j) f[i][j] = -1e9;
  double ans = dp(n, m);
  printf("%.10f %.10f\n", ans, 1 - ans);
  return 0;
}
}  // namespace i207M
signed main() {
  i207M::main();
  return 0;
}