組み合わせの数 ビットカウントバージョン
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
出来た。