#include <iostream>
#include <vector>
#include <cmath>
#include <unordered_map>
#include <fstream>
#include <string>
#include <queue>

int min(int a, int b) {
	return (a < b) ? a : b;
}

struct point {
	int x, y;
};

float tt(point p1, point p2, point p3) {
	return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);
}

bool check(point p1, point p2, point p3) {
	point pp;
	pp.x = 0;
	pp.y = 0;
	float a1 = tt(pp, p1, p2);
	float a2 = tt(pp, p2, p3);
	float a3 = tt(pp, p3, p1);

	return ((a1 <= 0) && (a2 <= 0) && (a3 <= 0) || (a1 >= 0) && (a2 >= 0) && (a3 >= 0));
}

int main()
{
	std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);
	int n, k;
	std::cin >> n;

	std::vector<point> a(n);
	for (int i = 0; i < n; i++) {
		std::cin >> a[i].x >> a[i].y;
	}

	int res = 0;

	for (int i = 0; i < n; i++) {
		if (a[i].x == 0 && a[i].y == 0) {
			res++;
		}
		for (int j = i + 1; j < n; j++) {
			//n1 == n2
			if (a[j].x * a[i].y == a[i].x * a[j].y) {
				res++;
			}
			for (int k = j + 1; k < n; k++) {
				if (check(a[i], a[j], a[k])) {
					res++;
				}
			}
		}
	}

	std::cout << res << std::endl;

	return 0;
}