Problem:
Problem A: Sum of Consecutive Integers

あなたは数か月に渡る受験戦争を勝ち抜き，晴れてICPC大学に入学することができた．入学手続きの日，大学のキャンパス内では熱狂的なサークルの勧誘活動が行われており，あなたは大量のパンフレットを受け取って帰ってきた．部屋に戻ってきたあなたは受け取ったパンフレットの中から気になる一枚を見つけた．そのパンフレットは大学の広報部から渡されたものだった．

パンフレットには以下のような問題が記されていた．

和が N となるような，連続する2つ以上の正の整数の組み合わせは，何組存在するでしょうか？例えば， 9 は 2+3+4 と 4+5 の 2通りの組み合わせがあります．

この問題の答えが気になったあなたは，プログラムを書いてその答えを調べることにした．したがって，あなたの仕事は，入力として与えられる正の整数 N に対して，問題の答えを出力するプログラムを書くことである．

Input

入力はデータセットの並びである．各データセットはひとつの整数 N からなる一行である．ここで 1 ≤ N ≤ 1000 である．

入力の終りは，ひとつのゼロからなる一行で示される．

Output

出力は，入力の各データセットの表す正の整数に対する問題の答えを，入力データセットの順序通りに並べたものである．それ以外の文字が出力にあってはならない．

Sample Input

9
500
0

Output for the Sample Input

2
3

Solution in Haskell (judge verdict: Accepted)

import Control.Applicative
import Control.Monad
import Data.Vector.Unboxed (Vector, (!), (//))
import qualified Data.Vector.Unboxed as V

main :: IO ()
main = do
  n <- readLn
  unless (n == 0) $ do
    print $ solve n
    main

solve :: Int -> Int
solve n = let lv = n `div` 2 + 2
              v = V.unfoldr (\i -> if 2 * i <= n + 2
                                   then Just (i * (i + 1) `div` 2, i + 1)
                                   else Nothing) 0
          in length $ do
            i <- [0 .. lv - 2]
            guard $ bsearch v (v ! i + n) (i + 2) lv
            return ()
            

bsearch :: Vector Int -> Int -> Int -> Int -> Bool
bsearch v x l r
  | l >= r = False
  | x > y = bsearch v x (m + 1) r
  | x < y = bsearch v x l m
  | otherwise = True
  where
    m = (l + r) `div` 2
    y = v ! m