func_code_string: #include <bits/stdc++.h>   using namespace std;   int Gcd(int x, int y) {     while (x > 0 && y > 0) {       if (x > y) {         x = x % y;       } else {         y = y % x;       }     }     return x + y;   }   int Sign(int x) { return (x > 0) ? 1 : -1; }   int Abs(int x) { return (x > 0) ? x : -x; }   void ReduceFraction(int& x, int& y) {     if (x == 0) {       y = 1;     } else if (y == 0) {       x = 1;     } else {       int sgn = Sign(x) * Sign(y);       x = Abs(x);       y = Abs(y);       int g = Gcd(x, y);       x /= g;       y /= g;       x *= sgn;     }   }   struct Vector {     Vector(int vx, int vy) {       ReduceFraction(vx, vy);       x = vx;       y = vy;     }     int x;     int y;     bool operator==(const Vector& other) const {       return (x == other.x) && (y == other.y);     }   };   struct Line {     Line(int x0, int y0, int x1, int y1) : a(x1 - x0, y1 - y0) {       if (a.y != 0) {         u = a.y * x0 - a.x * y0;         v = a.y;         ReduceFraction(u, v);       } else {         u = y0;         v = 10001;       }     }     int u;     int v;     Vector a;     bool operator==(const Line& other) const {       return (u == other.u) && (v == other.v) && (a == other.a);     }   };   struct VectorHasher {     size_t operator()(Vector v) const {       const size_t coef = 39916801;       const hash<int> int_hasher;       return coef * int_hasher(v.x) + int_hasher(v.y);     }   };   struct LineHasher {     size_t operator()(const Line& l) const {       const size_t coef = 514229;       const hash<int> int_hasher;       const VectorHasher vector_hasher;       return coef * coef * int_hasher(l.u) + coef * int_hasher(l.v) +              vector_hasher(l.a);     }   };   long long Cn2(long long n) { return n * (n - 1) / 2; }   int main() {     int n;     cin >> n;     vector<pair<int, int>> pts(n);     for (int i = 0; i < n; ++i) {       cin >> pts[i].first >> pts[i].second;     }     unordered_map<Vector, unordered_set<Line, LineHasher>, VectorHasher> store;     for (int i = 0; i + 1 < n; ++i) {       for (int j = i + 1; j < n; ++j) {         Line new_line(pts[i].first, pts[i].second, pts[j].first, pts[j].second);         store[new_line.a].insert(new_line);       }     }     long long result = 0;     long long count = 0;     for (const auto& p : store) {       result -= Cn2(p.second.size());       count += p.second.size();     }     cout << result + Cn2(count);     return 0;   }   