/*
 * Symmetry (2002 TopCoder Inv Round 4 - Division I, Level Three)
 * http://www.topcoder.com/stat?c=problem_statement&pm=924
 */

#include <cstdio>
#include <cstdlib>
#include <map>

using namespace std;

#define N 256

struct ponto {
	long long w, x, y;
	bool operator < (const ponto &p) const {
		return w < p.w || (w == p.w && (x < p.x || (x == p.x && y < p.y)));
	}
} P[N];

typedef ponto reta;

ponto reta_determinada_por(ponto p, ponto q) {
	return (reta) { +p.x*q.y-q.x*p.y, -p.w*q.y+q.w*p.y, +p.w*q.x-q.w*p.x };
}

ponto ponto_medio(ponto p, ponto q) {
	return (ponto) { 2*p.w*q.w, q.w*p.x+q.x*p.w, q.w*p.y+q.y*p.w };
}

ponto ponto_infinito_na_reta_perpendicular(reta r) {
	return (reta) { 0, r.x, r.y };
}

int ponto_na_reta(ponto p, reta r) {
	return p.w*r.w + p.x*r.x + p.y*r.y == 0;
}

long long gcd(long long a, long long b) {
	return (b != 0) ? gcd(b, a % b) : a;
}

reta reformata_reta(reta r) {
	if (r.w < 0) {
		r.w = -r.w;
		r.x = -r.x;
		r.y = -r.y;
	} else if (r.w == 0) {
		if (r.x < 0) {
			r.x = -r.x;
			r.y = -r.y;
		} else if (r.x == 0 && r.y < 0) {
			r.y = -r.y;
		}
	}
	long long d = gcd(r.w, gcd(llabs(r.x), llabs(r.y)));
	return (reta) { r.w/d, r.x/d, r.y/d };
}

typedef map <reta,int> mapa;
int n;

int main() {
	scanf("%*d");
	for (n = 0; scanf("%lld %lld", &P[n].x, &P[n].y) != EOF; n++)
		P[n].w = 1;
	mapa M;
	for (int i = 0; i < n; i++) {
		for (int j = i+1; j < n; j++) {
			reta s = reformata_reta(reta_determinada_por(P[i], P[j]));
			ponto pm = ponto_medio(P[i], P[j]);
			ponto dir = ponto_infinito_na_reta_perpendicular(s);
			reta r = reformata_reta(reta_determinada_por(pm, dir));
			if (M.find(s) == M.end())
				M[s] = 0;
			if (M.find(r) == M.end())
				M[r] = 0;
			M[r]+= 2;
		}
	}
	int output = 0;
	for (mapa::iterator i = M.begin(); i != M.end(); i++) {
		for (int j = 0; j < n; j++)
			if (ponto_na_reta(P[j], i->first))
				i->second++;
		if (i->second == n)
			output++;
	}
	printf("%d\n", output);
	return 0;
}


