module Main where
genarrs
:: Int -> [(Int, Int)] -- Generate all possible inner 1d arraysgenarrs s = genarr 0 s
where
genarr _ 0 = []
genarr a b | a<=b = [(a,b)] ++ (genarr (a+1) b)
| a>b = genarr 0 (b-1)
cntoness (a,b) xs | a > b = 0
| a <= b = (xs!!a) + cntoness ((a+1),b) xs -- Input array consists only of ones and zeros
-- so we can use simple sum for count.
cntonesa (ab, (a,b)) xs | a > b = 0
| a <= b = (cntoness ab (xs!!a)) + cntonesa (ab, ((a+1),b)) xs
genarrs2d
:: Int -> Int -> [((Int, Int), (Int, Int))] -- Generate all possible inner 2d arraysgenarrs2d a b = [(x, y) | x <- genarrs a, y <- genarrs b]
main = do
let w = nums!!0
let h = nums!!1
let n = nums!!2
arr <- readMatr w h
let cnts
= map (\x
-> (cntonesa x
) arr
) (genarrs2d
(w
-1) (h
-1)) -- Coounts of ones in each array let fones
= length $ filter (==n
) cnts
-- Length of array constsists of only counts equals n
bW9kdWxlIE1haW4gd2hlcmUKCmdlbmFycnMgOjogSW50IC0+IFsoSW50LCBJbnQpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gR2VuZXJhdGUgYWxsIHBvc3NpYmxlIGlubmVyIDFkIGFycmF5cwpnZW5hcnJzIHMgPSBnZW5hcnIgMCBzCiAgICB3aGVyZQogICAgICAgIGdlbmFyciBfIDAgPSBbXQogICAgICAgIGdlbmFyciBhIGIgfCBhPD1iICA9IFsoYSxiKV0gKysgKGdlbmFyciAoYSsxKSBiKQogICAgICAgICAgICAgICAgICAgfCBhPmIgPSBnZW5hcnIgMCAoYi0xKQoKY250b25lc3MgOjogKEludCxJbnQpIC0+IFtJbnRdIC0+IEludApjbnRvbmVzcyAoYSxiKSB4cyB8IGEgPiBiID0gMAogICAgICAgICAgICAgICAgICB8IGEgPiAobGVuZ3RoIHhzKSB8fCBiID4gKGxlbmd0aCB4cykgPSAwCiAgICAgICAgICAgICAgICAgIHwgYSA8PSBiID0gKHhzISFhKSArIGNudG9uZXNzICgoYSsxKSxiKSB4cyAgLS0gSW5wdXQgYXJyYXkgY29uc2lzdHMgb25seSBvZiBvbmVzIGFuZCB6ZXJvcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHNvIHdlIGNhbiB1c2Ugc2ltcGxlIHN1bSBmb3IgY291bnQuCgpjbnRvbmVzYSA6OiAoKEludCxJbnQpLCAoSW50LEludCkpIC0+IFtbSW50XV0gLT4gSW50CmNudG9uZXNhIChhYiwgKGEsYikpIHhzIHwgYSA+IGIgPSAwCiAgICAgICAgICAgICAgICAgICAgICAgIHwgYSA+IChsZW5ndGggeHMpIHx8IGIgPiAobGVuZ3RoIHhzKSA9IDAKICAgICAgICAgICAgICAgICAgICAgICAgfCBhIDw9IGIgPSAoY250b25lc3MgYWIgKHhzISFhKSkgKyBjbnRvbmVzYSAoYWIsICgoYSsxKSxiKSkgeHMKCmdlbmFycnMyZCA6OiBJbnQgLT4gSW50IC0+IFsoKEludCwgSW50KSwgKEludCwgSW50KSldICAgICAgICAgLS0gR2VuZXJhdGUgYWxsIHBvc3NpYmxlIGlubmVyIDJkIGFycmF5cwpnZW5hcnJzMmQgYSBiID0gWyh4LCB5KSB8IHggPC0gZ2VuYXJycyBhLCB5IDwtIGdlbmFycnMgYl0KCnJlYWRNYXRyIDo6IEludCAtPiBJbnQgLT4gSU8gW1tJbnRdXQpyZWFkTWF0ciB3IGggPSBzZXF1ZW5jZSAuIHJlcGxpY2F0ZSBoICQgZm1hcCAobWFwIHJlYWQgLiB0YWtlIHcgLiB3b3JkcykgZ2V0TGluZQoKbWFpbiA6OiBJTyAoKQptYWluID0gZG8KICAgIHNpemVzbG4gPC0gZ2V0TGluZQogICAgbGV0IG51bXMgPSBtYXAgcmVhZCAkIHdvcmRzIHNpemVzbG4KICAgIGxldCB3ID0gbnVtcyEhMAogICAgbGV0IGggPSBudW1zISExCiAgICBsZXQgbiA9IG51bXMhITIKICAgIGFyciA8LSByZWFkTWF0ciB3IGgKICAgIGxldCBjbnRzID0gbWFwIChceCAtPiAoY250b25lc2EgeCkgYXJyKSAoZ2VuYXJyczJkICh3LTEpIChoLTEpKSAtLSBDb291bnRzIG9mIG9uZXMgaW4gZWFjaCBhcnJheQogICAgbGV0IGZvbmVzID0gbGVuZ3RoICQgZmlsdGVyICg9PW4pIGNudHMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIExlbmd0aCBvZiBhcnJheSBjb25zdHNpc3RzIG9mIG9ubHkgY291bnRzIGVxdWFscyBuCiAgICBwcmludCBmb25lcw==