import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Vincent {
	private record Point(long x, long y) {
	}

	private static long area(Point p1, Point p2, Point p3) {
		return p1.x() * p2.y() + p2.x() * p3.y() + p3.x() * p1.y() - p1.y() * p2.x() - p2.y() * p3.x() - p3.y() * p1.x();
	}

	private static int dx(Point p, long Gx, long Fx) {
		return p.x() > Gx ? 1 : (p.x() == Gx && Fx == 0) ? 0 : -1;
	}

	private static int dy(Point p, long Gy, long Fy) {
		return p.y() > Gy ? 1 : (p.y() == Gy && Fy == 0) ? 0 : -1;
	}

	private static int orientation(Point p, Point q, Point g, long Fx, long Fy, long d) {
		if (d < 0) {
			d = -d;
			Fx = -Fx;
			Fy = -Fy;
		}
		long px = p.x() * Fy;
		long py = p.y() * Fx;
		long qx = q.x() * Fy;
		long qy = q.y() * Fx;
		long a1 = area(p, q, g) - (px / d) + (py / d) + (qx / d) - (qy / d);
		px -= d * (px / d);
		py -= d * (py / d);
		qx -= d * (qx / d);
		qy -= d * (qy / d);
		long r = py + qx - px - qy;
		while (r < 0) {
			r += d;
			a1--;
		}
		a1 += r / d;
		r %= d;
		return a1 > 0 ? 1 : a1 < 0 ? -1 : r > 0 ? 1 : 0;
	}

	private static void read() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		Point[] tab = new Point[N];

		for (int i = 0; i < N; i++) {
			String[] line = br.readLine().split(" ");
			tab[i] = new Point(Long.parseLong(line[0]), Long.parseLong(line[1]));
		}
		br.close();

		long gx = 0, gy = 0, a = 0;
		for (int i = 1; i < N-1; i++) {
			long ar = area(tab[0], tab[i], tab[i + 1]);
			gx += ar * (tab[0].x() + tab[i].x() + tab[i + 1].x());
			gy += ar * (tab[0].y() + tab[i].y() + tab[i + 1].y());
			a += 3 * ar;
		}
		long Gx = gx / a, Fx = gx % a, Gy = gy / a, Fy = gy % a, ax = a;
		Point G = new Point(Gx, Gy);
		if (Fx == 0 && Fy == 0) {
			for (int i = 0; i < N; i++) {
				if (tab[i].equals(G)) {
					N--;
					tab[i] = tab[N];
					i--;
				}
			}
		}

		Comparator<Point> comp = (p, q) -> {
			if (dx(p, Gx, Fx) == 0 && dx(q, Gx, Fx) == 0) {
				return p.y() > q.y() ? 1 : -1;
			} else if (dx(p, Gx, Fx) == 0) {
				return dy(p, Gy, Fy) == -1 && dx(q, Gx, Fx) == 1 ? -1 : 1;
			} else if (dx(q, Gx, Fx) == 0) {
				return dy(q, Gy, Fy) == -1 && dx(p, Gx, Fx) == 1 ? 1 : -1;
			} else if (dx(p, Gx, Fx) != dx(q, Gx, Fx)) {
				return dx(p, Gx, Fx) - dx(q, Gx, Fx);
			} else {
				return orientation(q, p, G, Fx, Fy, ax);
			}
		};

		Arrays.sort(tab, 0, N, comp);
		long sum = N;
		sum = sum * (sum-1) * (sum-2) / 6;
		int j = 1;
		for (int i = 0; i < N; i++) {
			while (orientation(tab[i], tab[j % N], G, Fx, Fy, a) != -1) {
				j++;
			}
			long d = j-i-1;
			d = d * (d-1) / 2;
			sum -= d;
		}
		System.out.println(sum);
	}

	public static void main(String[] args) throws IOException {
		read();
	}
}
