Language: C++

#include <bits/stdc++.h>
#define gcd std::__gcd
#define EB emplace_back

typedef std::pair <int, int> pr;

struct _hash_ {
	typedef unsigned long long u64;
	static std::hash <u64> H;
	inline size_t operator () (const pr &x) const {return H(x.first | (u64)x.second << 32);}
};

typedef std::unordered_map <pr, int, _hash_> umap;
typedef std::vector <int> vector;
const int N = 254, mod = 998244353;

int n, cnt = 0;
int x[N], y[N], pw2[N];
umap M;
vector ps[N * N];

inline int get(const pr &v) {
	umap::iterator it; bool ret;
	std::tie(it, ret) = M.emplace(v, cnt + 1);
	return ret ? ++cnt : it->second;
}

inline int gw(int n) {return (pw2[n] - n - 1 + mod) % mod;}

int main() {
	int i, j, A, B, d, m, ans = 0;
	scanf("%d", &n);
	for (*pw2 = i = 1; i <= n; ++i) pw2[i] = pw2[i - 1] * 2 % mod;
	M.reserve(n * n), M.rehash(n * n * n);
	for (i = 0; i < n; ++i) {
		scanf("%d%d", x + i, y + i);
		for (j = 0; j < i; ++j) {
			d = gcd(A = y[i] - y[j], B = x[j] - x[i]);
			if (A /= d, B /= d, A < 0) A = -A, B = -B;
			d = get(pr(A, B)), ps[d].EB(i), ps[d].EB(j);
		}
	}
	for (auto &v : M) {
		std::tie(A, B) = v.first;
		vector &p = ps[v.second];
		std::sort(p.begin(), p.end());
		p.erase(std::unique(p.begin(), p.end()), p.end());
		for (int &k : p) k = A * x[k] + B * y[k];
		std::sort(p.begin(), p.end()), m = p.size();
		for (i = j = 0; i < m; i = j) {
			for (; j < m && p[i] == p[j]; ++j);
			ans += gw(j - i);
		}
	}
	ans = pw2[n] - n - 1 - ans;
	printf("%d\n", ans + (ans >> 31 & mod));
	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:40:32: error: call of overloaded 'get(pr)' is ambiguous
   40 |                         d = get(pr(A, B)), ps[d].EB(i), ps[d].EB(j);
      |                             ~~~^~~~~~~~~~
In file included from /usr/include/c++/14/bits/stl_algobase.h:64,
                 from /usr/include/c++/14/algorithm:60,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:51,
                 from a.cc:1:
/usr/include/c++/14/bits/stl_pair.h:1277:5: note: candidate: 'constexpr const _Tp& std::get(const pair<_T1, _T2>&) [with _Tp = int; _Up = int]'
 1277 |     get(const pair<_Tp, _Up>& __p) noexcept
      |     ^~~
/usr/include/c++/14/bits/stl_pair.h:1282:5: note: candidate: 'constexpr _Tp&& std::get(pair<_T1, _T2>&&) [with _Tp = int; _Up = int]'
 1282 |     get(pair<_Tp, _Up>&& __p) noexcept
      |     ^~~
/usr/include/c++/14/bits/stl_pair.h:1287:5: note: candidate: 'constexpr const _Tp&& std::get(const pair<_T1, _T2>&&) [with _Tp = int; _Up = int]'
 1287 |     get(const pair<_Tp, _Up>&& __p) noexcept
      |     ^~~
/usr/include/c++/14/bits/stl_pair.h:1297:5: note: candidate: 'constexpr const _Tp& std::get(const pair<_Up, _Tp>&) [with _Tp = int; _Up = int]'
 1297 |     get(const pair<_Up, _Tp>& __p) noexcept
      |     ^~~
/usr/include/c++/14/bits/stl_pair.h:1302:5: note: candidate: 'constexpr _Tp&& std::get(pair<_Up, _Tp>&&) [with _Tp = int; _Up = int]'
 1302 |     get(pair<_Up, _Tp>&& __p) noexcept
      |     ^~~
/usr/include/c++/14/bits/stl_pair.h:1307:5: note: candidate: 'constexpr const _Tp&& std::get(const pair<_Up, _Tp>&&) [with _Tp = int; _Up = int]'
 1307 |     get(const pair<_Up, _Tp>&& __p) noexcept
      |     ^~~
a.cc:22:12: note: candidate: 'int get(const pr&)'
   22 | inline int get(const pr &v) {
      |            ^~~