import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.List
import Data.Array
import Control.Monad

main = do
  li <- BS.getLine
  let Just (n,_) = BS.readInt li
  li <- BS.getLine
  let as = unfoldr (BS.readInt . BS.dropWhile isSpace) li
  let ans = compute n as
  mapM_ print ans

compute :: Int -> [Int] -> [Int]
compute n as = n : [sum $ unfoldr (step k) as1 | k <- [2..n] ]
  where
    aa = accumArray (+) 0 (1,n) [ (a,1) | a <- as ]
    as1 = sortBy (flip compare) $ filter (0 <) $ elems aa

step k as
  | length as1 < k = Nothing
  | True = Just (ak, merge as2 $ filter (0 <) $ map (subtract ak) as1)
  where
    (as1,as2) = splitAt k as
    ak = last as1

merge xxs@(x:xs) yys@(y:ys) =
  case compare x y of
    LT -> x : merge xs yys
    EQ -> x : y : merge xs ys
    GT -> y : merge xxs ys
merge xs [] = xs
merge [] ys = ys

{-
番号ごとに枚数を集計したら、
重複した枚数がそれぞれいくつなのかだけが重要になる。
大きい方からK種類を選び、全てからakを引く。カウントをak増やす、を繰り返す。
このときはmergeが使えそう。
これをKの違いごとに繰り返す他ないのか。4のできる回数と2のできる回数に関連はあるよね。
kをやりたいとき、kの倍数がやってあるか見る。2kがその最小の。
その結果を2倍しつつ、最終状態から継続すればよい。
K/2からKの間は真面目にやるしかないのか？まぁあまりなさそうだが。
とりあえずkの間で情報の再利用がない版
-}