import java.io.OutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; import java.io.Writer; import java.io.OutputStreamWriter; import java.io.BufferedReader; import java.io.InputStream; /** * Built using CHelper plug-in * Actual solution is at the top * * @author lewin */ public class double_sort_lewin { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader2 in = new InputReader2(inputStream); OutputWriter out = new OutputWriter(outputStream); DoubleSort solver = new DoubleSort(); solver.solve(1, in, out); out.close(); } static class DoubleSort { int n; int m; double[][][] dp; public void solve(int testNumber, InputReader2 in, OutputWriter out) { n = in.nextInt(); m = in.nextInt(); dp = new double[n + 1][m + 1][]; for (int remaining = 1; remaining <= m; remaining++) { dp[1][remaining] = new double[]{(remaining + 1) / 2.0}; double base = 1.0 / remaining; for (int total = 2; total <= n && total <= remaining; total++) { dp[total][remaining] = new double[total]; for (int i = 0; i < total; i++) dp[total][remaining][i] = i + 1; base *= 1.0 * total / (remaining - total + 1); double prob = base; for (int big = 0; big <= remaining - total && big <= total; big++) { // fix number of elements that are strictly larger than 1 // prob = comb(remaining - total, big) * comb(total, big) / comb(remaining, total) for (int j = 0; j < big; j++) dp[total][remaining][j + total - big] += prob * dp[big][remaining - total][j]; prob *= 1.0 * (remaining - total - big) / (big + 1) * (total - big) / (big + 1); } } } for (int i = 0; i < n; i++) { out.printf("%.15f\n", dp[n][m][i]); } } } static class InputReader2 { private BufferedReader in; private StringTokenizer st; public InputReader2(InputStream stream) { in = new BufferedReader(new InputStreamReader(stream)); st = null; } public int nextInt() { return Integer.parseInt(next()); } public String next() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(in.readLine()); } catch (IOException e) { e.printStackTrace(); } } return st.nextToken(); } } static class OutputWriter { private final PrintWriter writer; public OutputWriter(OutputStream outputStream) { writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream))); } public OutputWriter(Writer writer) { this.writer = new PrintWriter(writer); } public void printf(String format, Object... objects) { writer.printf(format, objects); } public void close() { writer.close(); } } }