module Enumerable
def tally(h = {})
each_with_object(h) {|x, h| h[x] = (h[x] || 0) + 1}
end
end
def n_permutations(a)
factrial = ->n {(1..n).inject(:*) || 1}
factrial.(a.size) / a.tally.values.map(&factrial).inject(:*)
end
def next_or_nil(a)
(a.size - 2).downto(0).each_with_object(nil) {|i, _|
next if not j = (i + 1...a.size).find {|j| 2 <= a[j] - a[i]}
return a.dup.tap {|a|
a[i] += 1; a[j] -= 1
loop {
j = (i + 1...a.size).find {|j| a[i] < a[j]}
k = j && (a.size - 1).downto(j + 1).find {|k| a[j] <= a[k] && a[k] < 5}
break if !k
a[j] -= 1; a[k] += 1
}
}
}
end
def nexts(a)
a && [a].tap {|b| b << a while a = next_or_nil(a)}
end
def initial(s, w)
q, r = (s - w).divmod 4
0 < w && w <= s && s <= w * 5 && (r == 0 || q + 1 <= w) && Array.new(w, 1).tap {|b|
(1..q).each {|i| b[-i] += 4}
b[-q -1] += r if 0 < r
} || nil
end
def f(m, n)
count_permutations = ->s, w {
nexts(initial(s, w))&.map(&method(:n_permutations))&.sum || 0
}
aux = ->acc, b, s, w {
return acc if !b || s < 1 || w < 1
return acc << s if w == 1
(1..5).inject(b) {|b, d|
c = count_permutations.(s - d, w - 1)
return aux.(acc << d, b, s - d, w - 1) if n <= b + c
b + c
} && nil
}
(1..m).inject(0) {|b, w|
c = count_permutations.(m, w)
return aux.([], b, m, w).join.to_i if n <= b + c
b + c
} && 0
end
g = ->m, n {puts "(#{m},#{n}) → #{f(m, n)}"}
g.(2,1)
g.(2,2)
g.(2,3)
g.(20,1)
g.(20,2)
g.(20,3)
g.(20,400096)
g.(20,400097)
g.(32,1)
g.(32,2)
g.(32,3)
g.(32,1000)
g.(32,1000000)
g.(32,1000000000)
g.(32,1333610936)
g.(32,1333610937)
bW9kdWxlIEVudW1lcmFibGUKICBkZWYgdGFsbHkoaCA9IHt9KQogICAgZWFjaF93aXRoX29iamVjdChoKSB7fHgsIGh8IGhbeF0gPSAoaFt4XSB8fCAwKSArIDF9CiAgZW5kCmVuZApkZWYgbl9wZXJtdXRhdGlvbnMoYSkKICBmYWN0cmlhbCA9IC0+biB7KDEuLm4pLmluamVjdCg6KikgfHwgMX0KICBmYWN0cmlhbC4oYS5zaXplKSAvIGEudGFsbHkudmFsdWVzLm1hcCgmZmFjdHJpYWwpLmluamVjdCg6KikKZW5kCmRlZiBuZXh0X29yX25pbChhKQogIChhLnNpemUgLSAyKS5kb3dudG8oMCkuZWFjaF93aXRoX29iamVjdChuaWwpIHt8aSwgX3wKICAgIG5leHQgaWYgbm90IGogPSAoaSArIDEuLi5hLnNpemUpLmZpbmQge3xqfCAyIDw9IGFbal0gLSBhW2ldfQogICAgcmV0dXJuIGEuZHVwLnRhcCB7fGF8CiAgICAgIGFbaV0gKz0gMTsgYVtqXSAtPSAxCiAgICAgIGxvb3AgewogICAgICAgIGogPSAoaSArIDEuLi5hLnNpemUpLmZpbmQge3xqfCBhW2ldIDwgYVtqXX0KICAgICAgICBrID0gaiAmJiAoYS5zaXplIC0gMSkuZG93bnRvKGogKyAxKS5maW5kIHt8a3wgYVtqXSA8PSBhW2tdICYmIGFba10gPCA1fQogICAgICAgIGJyZWFrIGlmICFrCiAgICAgICAgYVtqXSAtPSAxOyBhW2tdICs9IDEKICAgICAgfQogICAgfQogIH0KZW5kCmRlZiBuZXh0cyhhKQogIGEgJiYgW2FdLnRhcCB7fGJ8IGIgPDwgYSB3aGlsZSBhID0gbmV4dF9vcl9uaWwoYSl9CmVuZApkZWYgaW5pdGlhbChzLCB3KQogIHEsIHIgPSAocyAtIHcpLmRpdm1vZCA0CiAgMCA8IHcgJiYgdyA8PSBzICYmIHMgPD0gdyAqIDUgJiYgKHIgPT0gMCB8fCBxICsgMSA8PSB3KSAmJiBBcnJheS5uZXcodywgMSkudGFwIHt8YnwKICAgICgxLi5xKS5lYWNoIHt8aXwgYlstaV0gKz0gNH0KICAgIGJbLXEgLTFdICs9IHIgaWYgMCA8IHIKICB9IHx8IG5pbAplbmQKZGVmIGYobSwgbikKICBjb3VudF9wZXJtdXRhdGlvbnMgPSAtPnMsIHcgewogICAgbmV4dHMoaW5pdGlhbChzLCB3KSkmLm1hcCgmbWV0aG9kKDpuX3Blcm11dGF0aW9ucykpJi5zdW0gfHwgMAogIH0KICBhdXggPSAtPmFjYywgYiwgcywgdyB7CiAgICByZXR1cm4gYWNjIGlmICFiIHx8IHMgPCAxIHx8IHcgPCAxCiAgICByZXR1cm4gYWNjIDw8IHMgaWYgdyA9PSAxCiAgICAoMS4uNSkuaW5qZWN0KGIpIHt8YiwgZHwKICAgICAgYyA9IGNvdW50X3Blcm11dGF0aW9ucy4ocyAtIGQsIHcgLSAxKQogICAgICByZXR1cm4gYXV4LihhY2MgPDwgZCwgYiwgcyAtIGQsIHcgLSAxKSBpZiBuIDw9IGIgKyBjCiAgICAgIGIgKyBjCiAgICB9ICYmIG5pbAogIH0KICAoMS4ubSkuaW5qZWN0KDApIHt8Yiwgd3wKICAgIGMgPSBjb3VudF9wZXJtdXRhdGlvbnMuKG0sIHcpCiAgICByZXR1cm4gYXV4LihbXSwgYiwgbSwgdykuam9pbi50b19pIGlmIG4gPD0gYiArIGMKICAgIGIgKyBjCiAgfSAmJiAwCmVuZApnID0gLT5tLCBuIHtwdXRzICIoI3ttfSwje259KSDihpIgI3tmKG0sIG4pfSJ9CmcuKDIsMSkKZy4oMiwyKQpnLigyLDMpCmcuKDIwLDEpCmcuKDIwLDIpCmcuKDIwLDMpCmcuKDIwLDQwMDA5NikKZy4oMjAsNDAwMDk3KQpnLigzMiwxKQpnLigzMiwyKQpnLigzMiwzKQpnLigzMiwxMDAwKQpnLigzMiwxMDAwMDAwKQpnLigzMiwxMDAwMDAwMDAwKQpnLigzMiwxMzMzNjEwOTM2KQpnLigzMiwxMzMzNjEwOTM3KQo=
(2,1) → 2
(2,2) → 11
(2,3) → 0
(20,1) → 5555
(20,2) → 14555
(20,3) → 15455
(20,400096) → 11111111111111111111
(20,400097) → 0
(32,1) → 2555555
(32,2) → 3455555
(32,3) → 3545555
(32,1000) → 34355354
(32,1000000) → 11532334334
(32,1000000000) → 2141111311212411131
(32,1333610936) → 11111111111111111111111111111111
(32,1333610937) → 0