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>
const double eps = 1e-9;
double dp[1024][1024];
double rr[1024][1024];
double getDP(int, int);
double x;
double om, on;
inline double evalBluf(int n, int m, double bp) {
  double p = bp / (bp + (1.0 - bp) * om);
  double px = p * x;
  if (on > 1.0 - p && on > p * x) return on;
  if (1.0 - p > px) return 1.0 - p;
  return px;
}
double my;
inline double eval(int n, int m, double bp) {
  double eb = 1.0 - evalBluf(n, m, bp);
  return bp * (eb) + (1.0 - bp) * om * (eb + my);
}
inline double getDP(int n, int m) {
  if (m == 0) {
    return (dp[n][m] = 1.0);
  }
  if (n == 0) {
    return (dp[n][m] = 1.0 / (m + 1));
  }
  x = dp[m][n - 1];
  my = m * (1.0 - dp[m - 1][n]);
  om = 1.0 / (m + 1);
  on = 1.0 / (n + 1);
  dp[n][m] = om;
  double l, r;
  if (m <= 130 || n <= 130)
    l = 0.0, r = 1.0;
  else
    l = rr[n][m - 1] - 0.001, r = rr[n][m - 1] + 0.001;
  if (l < 0) l = 0;
  if (r > 1) r = 1;
  double dif = r - l;
  while (dif > eps) {
    double st = dif / 3;
    double m1 = l + st, m2 = r - st;
    if (eval(n, m, m1) < eval(n, m, m2))
      l = m1;
    else
      r = m2;
    dif -= st;
  }
  dp[n][m] = std::max(dp[n][m], eval(n, m, r));
  rr[n][m] = r;
  return dp[n][m];
}
int main() {
  memset(dp, -1, sizeof(dp));
  int n, m;
  scanf("%d %d", &n, &m);
  int mx = std::max(n, m);
  for (int i = 0; i <= 2 * mx; ++i) {
    for (int j = 0; j <= i; ++j) {
      if (i - j > mx || j > mx) continue;
      getDP(j, i - j);
    }
  }
  double swin = getDP(n, m);
  printf("%.11lf %.11lf\n", swin, 1.0 - swin);
  return 0;
}