組み合わせの数 ビットカウントバージョン

import Bits
import List

bitCount1 :: Int -> Int
bitCount1 b = (foldl f) b [(1,0x55555555),(2,0x33333333),
         (4,0x0f0f0f0f),(8,0x00ff00ff),(16,0x0000ffff)]
               where
                  f :: Int -> (Int,Int) -> Int
                  f b (n,a) = (b .&. a) + ((shiftR b  n).&. a)

c n k = (map length $ group $ sort $ map bitCount1 $ [0..2^n-1]) !! k

実行結果

*Main> c 6 3
20
*Main> c 4 0
1
*Main> c 8 2
28

出来た。