Problem:
Score : 700 points

Problem Statement

You are given N points (x_i,y_i) located on a two-dimensional plane.
Consider a subset S of the N points that forms a convex polygon.
Here, we say a set of points S forms a convex polygon when there exists a convex polygon with a positive area that has the same set of vertices as S. All the interior angles of the polygon must be strictly less than 180°.

For example, in the figure above, {A,C,E} and {B,D,E} form convex polygons; {A,C,D,E}, {A,B,C,E}, {A,B,C}, {D,E} and {} do not.

For a given set S, let n be the number of the points among the N points that are inside the convex hull of S (including the boundary and vertices). Then, we will define the score of S as 2^{n-|S|}.

Compute the scores of all possible sets S that form convex polygons, and find the sum of all those scores.

However, since the sum can be extremely large, print the sum modulo 998244353.

Constraints

1≤N≤200

0≤x_i,y_i<10^4 (1≤i≤N)

If i≠j, x_i≠x_j or y_i≠y_j.

x_i and y_i are integers.

Input

The input is given from Standard Input in the following format:

N
x_1 y_1
x_2 y_2
:
x_N y_N

Output

Print the sum of all the scores modulo 998244353.

Sample Input 1

4
0 0
0 1
1 0
1 1

Sample Output 1

5

We have five possible sets as S, four sets that form triangles and one set that forms a square. Each of them has a score of 2^0=1, so the answer is 5.

Sample Input 2

5
0 0
0 1
0 2
0 3
1 1

Sample Output 2

11

We have three "triangles" with a score of 1 each, two "triangles" with a score of 2 each, and one "triangle" with a score of 4. Thus, the answer is 11.

Sample Input 3

1
3141 2718

Sample Output 3

0

There are no possible set as S, so the answer is 0.

Solution in Haskell (GHC 7.10.3) (judge verdict: Wrong Answer)

{-# LANGUAGE ScopedTypeVariables #-}
-- extension section
{-# OPTIONS_GHC -O2 -funbox-strict-fields #-}
{-# LANGUAGE BangPatterns      #-}
{-# LANGUAGE CPP               #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections     #-}
-- not supported extension
--{-# LANGUAGE Strict, StrictData #-}


module Main where

-- @@@@@@@@@@@@@@@@@--
-- import section   --
-- @@@@@@@@@@@@@@@@@--
--    import A.B.C( function name )  ...
-- or import A.B.C 

--
import           Prelude hiding(
  getLine,
  getContents,
  lines,
  words
  )

-- standard library
import           Control.Monad.ST
import           Control.Applicative
import           Data.Char
import           Data.Ratio


-- bytestring
import qualified Data.ByteString.Char8       as B
import qualified Data.ByteString.Unsafe      as B


-- containers
import           Data.Set

-- deepseq


-- regex-posix


-- text
import           Data.Text.Lazy.IO as TIO
import           Data.Text.Lazy as T
import           Data.Text.Lazy.Read as TR

-- import Data.Text.IO as TIO
-- import Data.Text as T
-- import Data.Text.Read as TR



-- unordered-containers


-- vectors
import qualified Data.Vector as V
import           Data.Vector.Unboxed as UV
import           Data.Vector.Unboxed.Mutable as MV


-- mtl


-- @@@@@@@@@@@@@@@@@--
-- main section     --
-- @@@@@@@@@@@@@@@@@--

main :: IO ()
main = do
  input <- getInput
  Prelude.putStr . show . getAnswer $ input 

-- main :: IO()
-- main = do
--   answer <- getInputandanser
--   putStr . show $ answer


-- @@@@@@@@@@@@@@@@@@@@@--
-- I/O DataType section --
-- @@@@@@@@@@@@@@@@@@@@@--
data Input = I (Int, UV.Vector (Int, Int) )
  deriving(Show)

type Answer = Int


-- @@@@@@@@@@@@@@@@@--
-- answerSection    --
-- @@@@@@@@@@@@@@@@@--
getInput :: IO Input
getInput = do
  n <- (UV.!0) <$> intVectorFromLine 1 
  input <- generatePairVectorFromLine n
  return $ I (n , input)

getAnswer :: Input -> Answer 
getAnswer (I (n, v)) | n == 1 = 0
                     | otherwise =  ( ( 2^n )- ( 1 + n + res  ) ) 
  where res =  go 0 1 0 Data.Set.empty
        go !i1 !i2 !accum' !lset 
          | i1 == n-2 && i2 == n-1 = (  (accum'+ dScore)) 
          | i2 == n-1 = go (i1+1) (i1+2) (  (accum'+ dScore))  ( ins l )
          | otherwise = go i1 (i2+1) (   (accum'+ dScore))  (ins l)
          where l = lineFromPoint n1 n2 
                dScore | l `member` lset = 0
                       | otherwise = 2^k - k - 1
                (k:: Int) = case l of
                  L (True,_,_,_,_) -> (1+). UV.length .UV.filter  ( == True) $ UV.map ( (l==) . (lineFromPoint n1)) ( v :: UV.Vector (Int,Int) )  
                  L (False,_,_,_,_) -> UV.length .UV.filter  ( == True) $ UV.map ( (l==) . (lineFromPoint n1)) ( v :: UV.Vector (Int,Int) )  
                n1 = v UV.! i1
                n2 = v UV.! i2
                ins = flip insert lset

-- getAnswer :: Input -> Answer 
-- getAnswer (I (n, v)) | n == 1 = 0
--                      | otherwise = m' ( (m' 2^n + 998244353)- (m' $ 1 + n + res  ) ) 
--   where res =  go 0 1 0 Data.Set.empty
--         go !i1 !i2 !accum' !lset 
--           | i1 == n-2 && i2 == n-1 = ( m' (accum'+ dScore)) 
--           | i2 == n-1 = go (i1+1) (i1+2) ( m' (accum'+ dScore))  ( ins l )
--           | otherwise = go i1 (i2+1) (  m' (accum'+ dScore))  (ins l)
--           where l = lineFromPoint n1 n2 
--                 dScore | l `member` lset = 0
--                        | otherwise = 2^k - k - 1
--                 (k:: Int) = case l of
--                   L (True,_,_,_,_) -> (1+). UV.length .UV.filter  ( == True) $ UV.map ( (l==) . (lineFromPoint n1)) ( v :: UV.Vector (Int,Int) )  
--                   L (False,_,_,_,_) -> UV.length .UV.filter  ( == True) $ UV.map ( (l==) . (lineFromPoint n1)) ( v :: UV.Vector (Int,Int) )  
--                 n1 = v UV.! i1
--                 n2 = v UV.! i2
--                 ins = flip insert lset

getInputAndAnser :: IO Answer
getInputAndAnser = undefined


-- @@@@@@@@@@@@@@@@@@@@@@@@@@--
-- question unique section    --
-- @@@@@@@@@@@@@@@@@@@@@@@@@@--

newtype Line = L (Bool, Int,Int,Int,Int)
  deriving(Show)

instance Eq Line where
  (==) (L (False,x,_,_,_)) (L (False,x',_,_,_)) = x == x'
  (==) (L (True,a,a',b,b')) (L (True,aa,aa',bb,bb')) = Prelude.and [ a==aa,a'==aa',b==bb,b'==bb']
  (==) _ _ = False

instance Ord Line where
  compare (L (False,_,_,_,_)) (L (True,_,_,_,_)) = GT
  compare (L (True,_,_,_,_)) (L (False,_,_,_,_)) = LT
  compare (L (False,x,_,_,_)) (L (False,x',_,_,_)) = compare x x'
  compare l l' = compare ab ab'
    where coefficient (L ( True, x,y,z,a) ) = (x,y,z,a)
          ab = coefficient l
          ab' = coefficient l'



lineFromPoint :: (Int,Int) -> (Int,Int) -> Line
lineFromPoint (x0,y0) (x1,y1)
  | x0 /= x1 =
    L ( True , divA, divA' , divB, divB')    
  | otherwise = L (False,x0,minBound,minBound,minBound)
  where a = y1-y0
        a' = x1-x0
        b = (x1-x0)*y0 - (y1-y0)*x0
        b' = x1-x0
        factorA = gcd a a'
        factorB = gcd b b'
        (divA, divA') | a >= 0 && a' >= 0 = (a `div` factorA ,a `div` factorA) 
                      | a < 0 && a' >= 0 = (a `div` factorA ,a `div` factorA) 
                      | a >= 0 && a' < 0 = (-1 * a `div` factorA ,-1 * a `div` factorA) 
                      | a <  0 && a' < 0 = (-1 * a `div` factorA ,-1 * a `div` factorA) 
        (divB, divB') | b >= 0 && b' >= 0 = (b `div` factorB ,b `div` factorB) 
                      | b < 0 && b' >= 0 = (b `div` factorB ,b `div` factorB) 
                      | b >= 0 && b' < 0 = (-1 * b `div` factorB ,-1 * b `div` factorB) 
                      | b <  0 && b' < 0 = (-1 * b `div` factorB ,-1 * b `div` factorB) 



m' :: Int -> Int 
m' i = i `mod`998244353

-- @@@@@@@@@@@@@@@@@--
-- util section     --
-- @@@@@@@@@@@@@@@@@--

-- standard Input Function
gLine :: IO Text
gLine = getLine

gContents :: IO Text
gContents = getContents

-- intVectorFromline 5  ("1 2 3 4 5") -> vector <1,2,3,4,5> 
intVectorFromLine ::Int -> IO ( Vector Int )
intVectorFromLine n = UV.unfoldrN n (B.readInt.B.dropWhile isSpace) <$> B.getLine

pairFromLine :: IO (Int,Int)
pairFromLine = do
  v <- intVectorFromLine 2
  return ( v ! 0, v ! 1)

generatePairVectorFromLine :: Int -> IO ( Vector (Int, Int) )
generatePairVectorFromLine n = generateM n (const pairFromLine)