/*
struct Point {
int x;
int y;
Point() :
x(0), y(0) {
}
Point(int xx, int yy) {
x = xx;
y = yy;
}
};*/
#include <cstddef>
#include <cstdint>
#include <functional>
#include <unordered_map>
#include <utility>
#include <vector>
class DenseLine {
struct Line {
double k, b;
bool operator==(const Line& other) const {
return std::abs(k - other.k) < 1e-9 && std::abs(b - other.b) < 1e-9;
};
};
struct LineHash {
size_t operator()(const Line& l) const {
auto k_bucket = static_cast<int64_t>(l.k * 1e9);
auto b_bucket = static_cast<int64_t>(l.b * 1e9);
return hash<int64_t>()(k_bucket) ^ hash<int64_t>()(b_bucket);
}
};
public:
vector<double> getLine(vector<Point> p, int n) {
// write code here
unordered_map<Line, int, LineHash> lines;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++) {
double k = (p[j].y - p[i].y)*1.0 / (p[j].x - p[i].x );
double b = p[i].y - k * p[i].x;
lines[Line{k, b}]++;
}
int count = 0;
Line res;
for (auto l : lines) {
if (l.second > count) {
count = l.second;
res = l.first;
}
}
return {res.k, res.b};
}
};