nthPartition <- function(m, n)
{
A <- matrix(0, m, m)
A[1, 1:min(m, 5)] <- 1
if (m > 1) for (i in 2:m) for (j in 1:5) A[i, 0:-j] <- A[i, 0:-j] + A[i - 1, 0:(m - j)]
for (L in 1:m) {
if (n <= A[L, m]) break
ifelse(L < m, n <- n - A[L, m], return(0))
}
a <- integer(L)
for (i in 1:L) {
for (j in 1:5) {
if (i < L) {
if (n <= A[L - i, m - j]) break
n <- n - A[L - i, m - j]
} else {
if (j == m) break
}
}
a[i] <- j
m <- m - j
}
paste(a, collapse = "")
}
Q <- list(
c(2, 1), c(2, 2), c(2, 3),
c(20, 1), c(20, 2), c(20, 3), c(20, 400096), c(20, 400097),
c(32, 1), c(32, 2), c(32, 3), c(32, 1000), c(32, 1000000), c(32, 1000000000), c(32, 1333610936), c(32, 1333610937)
)
for (q in Q
) cat
(sprintf("(%d, %d) → %s\n", q
[1], q
[2], nthPartition
(q
[1], q
[2])))
bnRoUGFydGl0aW9uIDwtIGZ1bmN0aW9uKG0sIG4pCnsKICAgIEEgPC0gbWF0cml4KDAsIG0sIG0pCiAgICBBWzEsIDE6bWluKG0sIDUpXSA8LSAxCiAgICBpZiAobSA+IDEpIGZvciAoaSBpbiAyOm0pIGZvciAoaiBpbiAxOjUpIEFbaSwgMDotal0gPC0gQVtpLCAwOi1qXSArIEFbaSAtIDEsIDA6KG0gLSBqKV0KCiAgICBmb3IgKEwgaW4gMTptKSB7CiAgICAgICAgaWYgKG4gPD0gQVtMLCBtXSkgYnJlYWsKICAgICAgICBpZmVsc2UoTCA8IG0sIG4gPC0gbiAtIEFbTCwgbV0sIHJldHVybigwKSkKICAgIH0KCiAgICBhIDwtIGludGVnZXIoTCkKICAgIGZvciAoaSBpbiAxOkwpIHsKICAgICAgICBmb3IgKGogaW4gMTo1KSB7CiAgICAgICAgICAgIGlmIChpIDwgTCkgewogICAgICAgICAgICAgICAgaWYgKG4gPD0gQVtMIC0gaSwgbSAtIGpdKSBicmVhawogICAgICAgICAgICAgICAgbiA8LSBuIC0gQVtMIC0gaSwgbSAtIGpdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoaiA9PSBtKSBicmVhawogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBhW2ldIDwtIGoKICAgICAgICBtIDwtIG0gLSBqCiAgICB9CgogICAgcGFzdGUoYSwgY29sbGFwc2UgPSAiIikKfQoKUSA8LSBsaXN0KAogICAgYygyLCAxKSwgYygyLCAyKSwgYygyLCAzKSwKICAgIGMoMjAsIDEpLCBjKDIwLCAyKSwgYygyMCwgMyksIGMoMjAsIDQwMDA5NiksIGMoMjAsIDQwMDA5NyksCiAgICBjKDMyLCAxKSwgYygzMiwgMiksIGMoMzIsIDMpLCBjKDMyLCAxMDAwKSwgYygzMiwgMTAwMDAwMCksIGMoMzIsIDEwMDAwMDAwMDApLCBjKDMyLCAxMzMzNjEwOTM2KSwgYygzMiwgMTMzMzYxMDkzNykKKQoKZm9yIChxIGluIFEpIGNhdChzcHJpbnRmKCIoJWQsICVkKSDihpIgJXNcbiIsIHFbMV0sIHFbMl0sIG50aFBhcnRpdGlvbihxWzFdLCBxWzJdKSkp