>>299
御助言にしたがってHaskellに移植しました。

import System.Environment

choose (n,r) = product[1..n] `div` product[1..n-r] `div` product[1..r]

nloc m n k l = do
let q = div (n*k+l) m
r = mod (n*k+l) m
in (n-q)*(m-k) + q-1-l + if r>k then k-r else 0

nwin m n c = sum[choose ((nloc m n k l), c-1) | k<-[0..m-1], l<-[0..n-1], k*(n-1) < l*(m-1)]
mwin m n c = sum[choose ((nloc n m k l), c-1) | k<-[0..n-1], l<-[0..m-1], k*(m-1) < l*(n-1)]
draw m n c = choose(m*n,c) - nwin m n c - mwin n m c

main = do
argList <- getArgs -- m : 縦マス(短軸) n : 横マス(長軸) k : 宝の数
let m = read (argList !! 0)
n = read (argList !! 1)
k = read (argList !! 2)
putStrLn $ "p1st = " ++ show(mwin m n k) ++ ", q1st = " ++ show(nwin m n k) ++ ", draw = " ++ show(draw m n k)

おかげ様でこういうのも瞬時に計算してくれました。

10×20マスで宝が100個

>takara 10 20 100
p1st = 15057759425309840160151925452579572328997602171271937639470, q1st = 15057796557877993527038542474310161591275806044157319150135, draw = 60432921540347294111327092128863840691952977587098698541050