function nthPartition(m, n)
implicit none
character * 32 :: nthPartition
integer :: m, n, i, j, L, v(32)
integer, allocatable :: A(:, :)
allocate(A(m, m))
A = 0
A(1, 1:min(m, 5)) = 1
do i = 2, m
do j = 1, 5
A(i, j + 1:) = A(i, j + 1:) + A(i - 1, :m - j)
end do
end do
do L = 1, m
if (n <= A(L, m)) exit
if (L < m) then
n = n - A(L, m)
else
nthPartition = '0'
deallocate(A)
return
end if
end do
do i = 1, L
do j = 1, 5
if (i < L) then
if (n <= A(L - i, m - j)) exit
n = n - A(L - i, m - j)
else
if (j == m) exit
end if
end do
v(i) = j
m = m - j
end do
write(nthPartition, '(32(i0))') v(1:L)
deallocate(A)
end function
program main
implicit none
integer :: Q(2, 16) = reshape((/ &
(/2, 1/), (/2, 2/), (/2, 3/), &
(/20, 1/), (/20, 2/), (/20, 3/), (/20, 400096/), (/20, 400097/), &
(/32, 1/), (/32, 2/), (/32, 3/), (/32, 1000/), (/32, 1000000/), &
(/32, 1000000000/), (/32, 1333610936/), (/32, 1333610937/) &
/), (/2, 16/))
character * 32 :: nthPartition
integer :: i, m, n
do i = 1, size(Q, 2)
m = Q(1, i); n = Q(2, i)
print '("(", (i0), ", ", (i0), ") → ", (a))', m, n, nthPartition(m, n)
end do
end program
ZnVuY3Rpb24gbnRoUGFydGl0aW9uKG0sIG4pCiAgICBpbXBsaWNpdCBub25lCiAgICBjaGFyYWN0ZXIgKiAzMiA6OiBudGhQYXJ0aXRpb24KICAgIGludGVnZXIgOjogbSwgbiwgaSwgaiwgTCwgdigzMikKICAgIGludGVnZXIsIGFsbG9jYXRhYmxlIDo6IEEoOiwgOikKCiAgICBhbGxvY2F0ZShBKG0sIG0pKQogICAgQSA9IDAKICAgIEEoMSwgMTptaW4obSwgNSkpID0gMQogICAgZG8gaSA9IDIsIG0KICAgICAgICBkbyBqID0gMSwgNQogICAgICAgICAgICBBKGksIGogKyAxOikgPSBBKGksIGogKyAxOikgKyBBKGkgLSAxLCA6bSAtIGopCiAgICAgICAgZW5kIGRvCiAgICBlbmQgZG8KCiAgICBkbyBMID0gMSwgbQogICAgICAgIGlmIChuIDw9IEEoTCwgbSkpIGV4aXQKICAgICAgICBpZiAoTCA8IG0pIHRoZW4KICAgICAgICAgICAgbiA9IG4gLSBBKEwsIG0pCiAgICAgICAgZWxzZQogICAgICAgICAgICBudGhQYXJ0aXRpb24gPSAnMCcKICAgICAgICAgICAgZGVhbGxvY2F0ZShBKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbmQgaWYKICAgIGVuZCBkbwoKICAgIGRvIGkgPSAxLCBMCiAgICAgICAgZG8gaiA9IDEsIDUKICAgICAgICAgICAgaWYgKGkgPCBMKSB0aGVuCiAgICAgICAgICAgICAgICBpZiAobiA8PSBBKEwgLSBpLCBtIC0gaikpIGV4aXQKICAgICAgICAgICAgICAgIG4gPSBuIC0gQShMIC0gaSwgbSAtIGopCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGlmIChqID09IG0pIGV4aXQKICAgICAgICAgICAgZW5kIGlmCiAgICAgICAgZW5kIGRvCgogICAgICAgIHYoaSkgPSBqCiAgICAgICAgbSA9IG0gLSBqCiAgICBlbmQgZG8KCiAgICB3cml0ZShudGhQYXJ0aXRpb24sICcoMzIoaTApKScpIHYoMTpMKQogICAgZGVhbGxvY2F0ZShBKQplbmQgZnVuY3Rpb24KCnByb2dyYW0gbWFpbgogICAgaW1wbGljaXQgbm9uZQogICAgaW50ZWdlciA6OiBRKDIsIDE2KSA9IHJlc2hhcGUoKC8gJgogICAgICAgICAoLzIsIDEvKSwgKC8yLCAyLyksICgvMiwgMy8pLCAmCiAgICAgICAgICgvMjAsIDEvKSwgKC8yMCwgMi8pLCAoLzIwLCAzLyksICgvMjAsIDQwMDA5Ni8pLCAoLzIwLCA0MDAwOTcvKSwgJgogICAgICAgICAoLzMyLCAxLyksICgvMzIsIDIvKSwgKC8zMiwgMy8pLCAoLzMyLCAxMDAwLyksICgvMzIsIDEwMDAwMDAvKSwgJgogICAgICAgICAoLzMyLCAxMDAwMDAwMDAwLyksICgvMzIsIDEzMzM2MTA5MzYvKSwgKC8zMiwgMTMzMzYxMDkzNy8pICYKICAgIC8pLCAoLzIsIDE2LykpCgogICAgY2hhcmFjdGVyICogMzIgOjogbnRoUGFydGl0aW9uCiAgICBpbnRlZ2VyIDo6IGksIG0sIG4KCiAgICBkbyBpID0gMSwgc2l6ZShRLCAyKQogICAgICAgIG0gPSBRKDEsIGkpOyBuID0gUSgyLCBpKQogICAgICAgIHByaW50ICcoIigiLCAoaTApLCAiLCAiLCAoaTApLCAiKSDihpIgIiwgKGEpKScsIG0sIG4sIG50aFBhcnRpdGlvbihtLCBuKQogICAgZW5kIGRvCmVuZCBwcm9ncmFt