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;
long double smemo[1010][1010];
long double gamev(int m, int n, long double p2);
long double sq(int m, int n, long double p2) { return -(p2 - 1) * p2; }
long double maximize(int m, int n, long double V(int, int, long double),
                     long double low, long double high) {
  long double a = low;
  long double b = high;
  int itr = 10000;
  while (a < b) {
    long double p1 =
        a + (((long double)(rand() % 1000000) + 1) / (1000000 + 1)) * (b - a);
    long double p2 =
        a + (((long double)(rand() % 1000000) + 1) / (1000000 + 1)) * (b - a);
    if (p1 > p2) swap(p1, p2);
    long double v1 = V(m, n, p1);
    long double v2 = V(m, n, p2);
    if (v1 <= v2) {
      a = p1;
    } else {
      b = p2;
    }
  }
  assert(a <= b);
  return (a + b) / 2.0l;
}
long double S(int m, int n) {
  long double& ans = smemo[m][n];
  if (ans >= -0.5) return ans;
  if (n == 0) return ans = 1.0;
  if (m == 0) return ans = 1.0l / ((long double)(n + 1.0));
  long double play = S(n, m - 1);
  long double hit = S(n - 1, m);
  long double up = 1 / (play * (n + 1) + 1.0);
  ans = 1.0 / ((long double)(n + 1));
  ans = max(ans, gamev(m, n, up));
  assert((-0.000000001l <= (ans) && (ans) <= 1. + 0.000000001l));
  return ans;
}
long double gamev(int m, int n, long double p2) {
  long double play = S(n, m - 1);
  long double hit = S(n - 1, m);
  long double p3 = p2 * play * (n + 1);
  long double p1 = 1 - (p2 + p3);
  assert((-0.000000001l <= (p1) && (p1) <= 1. + 0.000000001l));
  assert((-0.000000001l <= (p2) && (p2) <= 1. + 0.000000001l));
  assert((-0.000000001l <= (p3) && (p3) <= 1. + 0.000000001l));
  long double kill = p1 / (n + 1.);
  long double bluff = p2;
  long double myplay = p3 * n * (1.0 - hit) / (n + 1.0);
  return kill + bluff + myplay;
}
int main() {
  srand(time(NULL));
  int M, N;
  cin >> M >> N;
  for (int i = 0; i < 1010; i++)
    for (int j = 0; j < 1010; j++) smemo[i][j] = -10;
  long double ans = S(M, N);
  cout << fixed << setprecision(16) << ans << " " << (1.0 - ans) << endl;
}