/*
TASK:convex
LANG:C
*/
#include <stdio.h>
#include <stdlib.h>
//#include <time.h>

#define MAXN 400
#define MODULE 1048576

typedef struct
  {
    int x,y;
  } SPoint;

SPoint pts[MAXN];
SPoint pts2[MAXN];
int n,k;
SPoint lowest;
int res = 0;
int T[MAXN][MAXN];
int visited_h[30000];

void Init()
  {
    int i;
    
//    freopen("convex.in","rt",stdin);
    scanf("%d",&n);
    for (i = 0;i < n;i++)
      scanf("%d%d",&pts[i].x,&pts[i].y);
  }

int VectorS(SPoint *p1,SPoint *p2,SPoint *p3)
  {
    return p1->x*p2->y + p1->y*p3->x + p2->x*p3->y - p1->x*p3->y - p1->y*p2->x - p2->y*p3->x;
  }

int cmp(const void *a,const void *b)
  {
    return VectorS(&lowest,(SPoint*)a,(SPoint*)b);
  }

void Solve()
  {
    int i,j,m,l;

    // Choose lowest point
    for (i = 0;i < n;i++)
      {
        lowest = pts[i];
//        if (visited_h[pts[i].y + 10000]) continue;
//        visited_h[pts[i].y + 10000] = 1;
        // Get the points above it
        k = 1;
        for (j = 0;j < n;j++)
          if (pts[j].y >= pts[i].y)
            {
              if (j == i) pts2[0] = pts[j];
              else pts2[k++] = pts[j];
            }

        // Sort the points
        qsort(&pts2[1],k - 1,sizeof(pts2[0]),cmp);

        for (j = 1;j < k;j++)
          for (l = j + 1;l < k;l++)
            if (pts2[l].y != lowest.y)
            {
              T[l][j] = 1;
              for (m = 1;m < j;m++)
                if (VectorS(&pts2[l],&pts2[j],&pts2[m]) > 0)
                  {
                    T[l][j] = (T[l][j] +  T[j][m]) % MODULE;
//                    break;
                  }

              res = (res +  T[l][j]) % MODULE;
            }
      }
  }

void Output()
  {
    printf("%d\n",res);
  }

int main()
  {
//    clock();
    Init();
    Solve();
    Output();
//    printf("Time : %lf sec.\n",(double)clock() / CLOCKS_PER_SEC);
    return 0;
  }
