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 Vincent2 {
	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) {
		long a1 = area(p, q, g);
		long a2 = (p.y() - q.y()) * Fx;
		long a3 = (q.x() - p.x()) * Fy;
		a1 += a2 / d + a3 / d;
		a2 %= d;
		a3 %= d;
		a2 += a3 + 2 * d;
		a1 += a2 / d - 2;
		a2 %= d;
		return a1 > 0 ? 1 : a1 < 0 ? -1 : a2 > 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();
	}
}
