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.(2000, 1 << 1024)
ZGVmIGYobSwgbikKICBjYyA9IFtdCiAgY291bnRfcGVybXV0YXRpb25zID0gLT5zLCB3IHsKICAgIGlmIHMgPCAxIHx8IHcgPCAxCiAgICAgIDAKICAgIGVsc2lmIHMgPD0gNSAmJiB3ID09IDEKICAgICAgMQogICAgZWxzaWYgY2Nbc10gJiYgY2Nbc11bd10KICAgICAgY2Nbc11bd10KICAgIGVsc2UKICAgICAgKGNjW3NdIHx8PSBbXSlbd10gPSAoMS4uNSkuaW5qZWN0KDApIHt8YywgZHwKICAgICAgICBjICsgY291bnRfcGVybXV0YXRpb25zLihzIC0gZCwgdyAtIDEpCiAgICAgIH0KICAgIGVuZAogIH0KICBhdXggPSAtPmFjYywgYiwgcywgdyB7CiAgICByZXR1cm4gYWNjIGlmIHMgPCAxIHx8IHcgPCAxCiAgICByZXR1cm4gYWNjIDw8IHMgaWYgdyA9PSAxCiAgICAoMS4uNSkuaW5qZWN0KGIpIHt8YiwgZHwKICAgICAgYyA9IGNvdW50X3Blcm11dGF0aW9ucy4ocyAtIGQsIHcgLSAxKQogICAgICByZXR1cm4gYXV4LihhY2MgPDwgZCwgYiwgcyAtIGQsIHcgLSAxKSBpZiBuIDw9IGIgKyBjCiAgICAgIGIgKyBjCiAgICB9ICYmIG5pbAogIH0KICAoMS4ubSkuaW5qZWN0KDApIHt8Yiwgd3wKICAgIGMgPSBjb3VudF9wZXJtdXRhdGlvbnMuKG0sIHcpCiAgICByZXR1cm4gYXV4LihbXSwgYiwgbSwgdykuam9pbi50b19pIGlmIG4gPD0gYiArIGMKICAgIGIgKyBjCiAgfSAmJiAwCmVuZApnID0gLT5tLCBuIHtwdXRzICIoI3ttfSwje259KSDihpIgI3tmKG0sIG4pfSJ9CmcuKDIwMDAsIDEgPDwgMTAyNCk=