Pagini recente » Monitorul de evaluare | Cod sursa (job #2367748) | Cod sursa (job #1555464) | Istoria paginii utilizator/lifofifo | Cod sursa (job #2212933)
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <map>
using namespace std;
pair<int, int> points[1000];
int cmmdc(int a, int b) {
if (b == 0) {
return a;
}
return cmmdc(b, a % b);
}
int compute(int n) {
return n * (n - 1) / 2;
}
int main() {
freopen("trapeze.in", "r", stdin);
freopen("trapeze.out", "w", stdout);
int n;
scanf("%d", &n);
map<pair<int, int>, int> nr;
int x, y;
for (int i = 0; i < n; ++i) {
scanf("%d %d", &x, &y);
points[i] = { x, y };
}
int dx, dy, v;
int vertical = 0;
int horizontal = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
dx = points[i].first - points[j].first;
dy = points[i].second - points[j].second;
if (dx == 0) {
horizontal++;
continue;
}
if (dy == 0) {
vertical++;
continue;
}
int sign = -1;
if (dx > 0 && dy > 0) {
sign = 1;
}
if (dx < 0 && dy < 0) {
sign = 1;
}
v = sign * cmmdc(abs(dx), abs(dy));
pair<int, int> nv = { abs(dx) / v, abs(dy) / v };
if (nr.count(nv)) {
nr[nv]++;
} else {
nr[nv] = 1;
}
}
}
int results = compute(horizontal) + compute(vertical);
for (auto x : nr) {
results += compute(x.second);
}
printf("%d", results);
return 0;
}