def f(m, n)
cc = []
count_permutations = ->s, w {
if s < 1 || w < 1
0
elsif s <= 5 && w == 1
1
elsif cc[s] && cc[s][w]
cc[s][w]
else
(cc[s] ||= [])[w] = (1..5).inject(0) {|c, d|
c + count_permutations.(s - d, w - 1)
}
end
}
aux = ->acc, b, s, w {
return acc if 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)
ZGVmIGYobSwgbikKICBjYyA9IFtdCiAgY291bnRfcGVybXV0YXRpb25zID0gLT5zLCB3IHsKICAgIGlmIHMgPCAxIHx8IHcgPCAxCiAgICAgIDAKICAgIGVsc2lmIHMgPD0gNSAmJiB3ID09IDEKICAgICAgMQogICAgZWxzaWYgY2Nbc10gJiYgY2Nbc11bd10KICAgICAgY2Nbc11bd10KICAgIGVsc2UKICAgICAgKGNjW3NdIHx8PSBbXSlbd10gPSAoMS4uNSkuaW5qZWN0KDApIHt8YywgZHwKICAgICAgICBjICsgY291bnRfcGVybXV0YXRpb25zLihzIC0gZCwgdyAtIDEpCiAgICAgIH0KICAgIGVuZAogIH0KICBhdXggPSAtPmFjYywgYiwgcywgdyB7CiAgICByZXR1cm4gYWNjIGlmIHMgPCAxIHx8IHcgPCAxCiAgICByZXR1cm4gYWNjIDw8IHMgaWYgdyA9PSAxCiAgICAoMS4uNSkuaW5qZWN0KGIpIHt8YiwgZHwKICAgICAgYyA9IGNvdW50X3Blcm11dGF0aW9ucy4ocyAtIGQsIHcgLSAxKQogICAgICByZXR1cm4gYXV4LihhY2MgPDwgZCwgYiwgcyAtIGQsIHcgLSAxKSBpZiBuIDw9IGIgKyBjCiAgICAgIGIgKyBjCiAgICB9ICYmIG5pbAogIH0KICAoMS4ubSkuaW5qZWN0KDApIHt8Yiwgd3wKICAgIGMgPSBjb3VudF9wZXJtdXRhdGlvbnMuKG0sIHcpCiAgICByZXR1cm4gYXV4LihbXSwgYiwgbSwgdykuam9pbi50b19pIGlmIG4gPD0gYiArIGMKICAgIGIgKyBjCiAgfSAmJiAwCmVuZApnID0gLT5tLCBuIHtwdXRzICIoI3ttfSwje259KSDihpIgI3tmKG0sIG4pfSJ9CmcuKDIsMSkKZy4oMiwyKQpnLigyLDMpCmcuKDIwLDEpCmcuKDIwLDIpCmcuKDIwLDMpCmcuKDIwLDQwMDA5NikKZy4oMjAsNDAwMDk3KQpnLigzMiwxKQpnLigzMiwyKQpnLigzMiwzKQpnLigzMiwxMDAwKQpnLigzMiwxMDAwMDAwKQpnLigzMiwxMDAwMDAwMDAwKQpnLigzMiwxMzMzNjEwOTM2KQpnLigzMiwxMzMzNjEwOTM3KQo=
(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