require "table2" local function throw_die(nsides, ndice, s, counts) if ndice == 0 then counts[s + 1] += 1 return end for i = 1, nsides do throw_die(nsides, ndice - 1, s + i, counts) end end local function beating_probability(nsides1, ndice1, nsides2, ndice2) local len1 = (nsides1 + 1) * ndice1 local c1 = table.rep(len1, 0) throw_die(nsides1, ndice1, 0, c1) local len2 = (nsides2 + 1) * ndice2 local c2 = table.rep(len2, 0) throw_die(nsides2, ndice2, 0, c2) local p12 = (nsides1 ^ ndice1) * (nsides2 ^ ndice2) local tot = 0 for i = 0, len1 - 1 do for j = 0, math.min(i, len2) - 1 do tot += c1[i + 1] * c2[j + 1] / p12 end end return tot end print(beating_probability(4, 9, 6, 6)) print(beating_probability(10, 5, 7, 6))