import java.util.ArrayList;
import java.util.List;
import java.util.Random;

class CriticalHit {
public static void main(String[] args) {
    class Combo {
        int d;
        int hp;
        public Combo(int d, int hp) {
            this.d = d;
            this.hp = hp;
        }
        public int getD() {
            return d;
        }
        public int getHp() {
            return hp;
        }
    }

    List input = new ArrayList<Combo>();

    input.add(new Combo(4, 1));
    input.add(new Combo(4, 4));
    input.add(new Combo(4, 5));
    input.add(new Combo(4, 6));
    input.add(new Combo(1, 10));
    input.add(new Combo(100, 200));
    input.add(new Combo(8, 20));

    input.forEach(s -> System.out.println(String.format("d: %d\thp: %d\tprobability: %8f\tdamage: %d",
            ((Combo) s).getD(),
            ((Combo) s).getHp(),
            CriticalHit.getCritChance(((Combo) s).getD(), ((Combo) s).getHp()),
            CriticalHit.getCrit(((Combo) s).getD()))));
}

public static int getCrit(double d) {
    int maxCrit = 0;
    if (d != 1) {
        Random r = new Random();
        maxCrit = 1 + r.nextInt((int) d);
        if (maxCrit == d)
            maxCrit += getCrit(d);
    }
    return maxCrit;
}

public static double getCritChance(double d, int hp) {
    int exponent = (int) (hp / d);
    int rest = (int) (hp % d);

    double chance = Math.pow(1 / d, exponent);
    if (rest > 0)
        chance *= (d - rest + 1) / d;

    return chance;
}
}