output_description: Print the sum of all the scores modulo 998244353.
  
  * * *
input_description: The input is given from Standard Input in the following format:
  
      
      
      N
      x_1 y_1
      x_2 y_2
      :
      x_N y_N
attempt: from fractions import Fraction
  from collections import defaultdict
  from itertools import combinations
  
  
  class Combination:
      """
      O(n)の前計算を1回行うことで，O(1)でnCr mod mを求められる
      n_max = 10**6のとき前処理は約950ms (PyPyなら約340ms, 10**7で約1800ms)
      使用例：
      comb = Combination(1000000)
      print(comb(5, 3))  # 10
      """
  
      def __init__(self, n_max, mod=10**9 + 7):
          self.mod = mod
          self.modinv = self.make_modinv_list(n_max)
          self.fac, self.facinv = self.make_factorial_list(n_max)
  
      def __call__(self, n, r):
          return self.fac[n] * self.facinv[r] % self.mod * self.facinv[n - r] % self.mod
  
      def make_factorial_list(self, n):
          # 階乗のリストと階乗のmod逆元のリストを返す O(n)
          # self.make_modinv_list()が先に実行されている必要がある
          fac = [1]
          facinv = [1]
          for i in range(1, n + 1):
              fac.append(fac[i - 1] * i % self.mod)
              facinv.append(facinv[i - 1] * self.modinv[i] % self.mod)
          return fac, facinv
  
      def make_modinv_list(self, n):
          # 0からnまでのmod逆元のリストを返す O(n)
          modinv = [0] * (n + 1)
          modinv[1] = 1
          for i in range(2, n + 1):
              modinv[i] = self.mod - self.mod // i * modinv[self.mod % i] % self.mod
          return modinv
  
  
  N = int(input())
  XY = [list(map(int, input().split())) for i in range(N)]
  
  D = defaultdict(int)
  for (x1, y1), (x2, y2) in combinations(XY, 2):
      if x1 != x2:
          a = Fraction(y2 - y1, x2 - x1)
          b = Fraction(y1) - a * Fraction(x1)
          D[(a, b)] += 1
      else:
          D[(None, x1)] += 1
  
  mod = 998244353
  comb = Combination(N + 1, mod)
  A = [0] * (N + 1)
  coA = [0] * (N + 1)
  ans = 0
  for i in range(3, N + 1):
      ans += comb(N, i)
      ans %= mod
  for i in range(3, N + 1):
      for j in range(i - 2):
          A[i] += (i - 2 - j) * (1 << j)
      coA[i] = coA[i - 1] + A[i]
  for (a, b), n in D.items():
      if n == 1:
          continue
      n = int((n << 1) ** 0.5) + 1
      ans -= coA[n]
      ans %= mod
  print(ans)
  
problem_description: 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°.
  
  ![cddb0c267926c2add885ca153c47ad8a.png](https://atcoder.jp/img/arc082/cddb0c267926c2add885ca153c47ad8a.png)
  
  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.
samples: [{"input": "4\n    0 0\n    0 1\n    1 0\n    1 1", "output": "5\n    \n\nWe have five possible sets as S, four sets that form triangles and one set\nthat forms a square. Each of them has a score of 2^0=1, so the answer is 5.\n\n* * *"}, {"input": "5\n    0 0\n    0 1\n    0 2\n    0 3\n    1 1", "output": "11\n    \n\nWe have three \"triangles\" with a score of 1 each, two \"triangles\" with a score\nof 2 each, and one \"triangle\" with a score of 4. Thus, the answer is 11.\n\n* * *"}, {"input": "1\n    3141 2718", "output": "0\n    \n\nThere are no possible set as S, so the answer is 0."}]