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 JAVA):

Solution:
import java.text.DecimalFormat;
import java.io.*;
import java.util.*;
import java.lang.reflect.Array;

/**
 * @author Mukesh Singh
 *
 */


public class AB {

    private InputStream input;
    private PrintStream output;
    private Scanner inputSc;

    public AB(InputStream input, PrintStream output) {
        this.input = input;
        this.output = output;
        init();
    }

    private void init() {
        inputSc = new Scanner(input);
    }

    static int lineToInt(String line) {
        return Integer.parseInt(line);
    }

    static long lineToLong(String line) {
        return Long.parseLong(line);
    }
    static double lineToDouble(String line) {
        return Double.parseDouble(line);
    }


    public void solve() 
	{
            solveTestCase();
    }

/**
 * @define global / instance variables 
 */

	HashMap<Integer,Integer> mat[] ;
	long dist[] ;
	int vec[] ;
	int par[] ;
	boolean isDone[] ;
	final long INF = 100000000000000000L ;
	int N;
	double ar[];
/**
 * @solve test case 
 */
@SuppressWarnings("unchecked")
    private void solveTestCase() 
	{
		int i , j  , k , n , m ,a1,b1,a2,b2,a3,b3,a4,b4 ;
		long N , M, K;
		DecimalFormat df = new DecimalFormat("#,###,##0.00");
        String str = inputSc.nextLine();
        String delims = "[ ]+";
		String[] tokens = str.split(delims);  
		n = lineToInt(tokens[0]);
		m = lineToInt(tokens[1]);
		double ans = 0 ;
		ar = new double[1000010];
		ar[0] = ar[1] = 0 ;
		for( i = 2 ; i< 1000010 ; i ++ )
		{
			ar[i] = ar[i-1] + Math.log(i);
		}
		for( k = 0 ; k <= n ; k ++ )
		{
			if( k <= m && (m * (n-1) >= n-k ))
			{
				ans += (k / (double) n) * (k / (double) n) * Math.exp( nCk(m , k ) + nCk(m * (n-1) , n-k )-nCk( m*n , n)) ;
			}
		
		}
		ans = ans * n ;
		output.println(ans);			
		
		
    }
    // returns nCk
	double nCk( int nn , int  kk)
	{
		//output.println(nn+" "+kk);
		return (ar[nn] - ar[nn-kk] - ar[kk] );
	}

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
	{
		FileInputStream in = null;
      	FileOutputStream out = null;
		PrintStream ps = null ;
		InputStream is = null ;
		try 
		{
         	is = new FileInputStream("file.in");
         	out = new FileOutputStream("file.out");
			ps = new PrintStream(out);
        }
		catch ( Exception e )
		{}

        AB sd = new AB(System.in, System.out);
        sd.solve();
		try
		{
        if (is != null) 
		{
	      is.close();
	    }
       	if (out != null) {
           	out.close();
       	}
		if (ps != null) {
           	ps.close();
         }
      	}catch (Exception e){}

		//SquareDetector sd = new SquareDetector(System.in, System.out);
        //sd.solve();
    }
}