#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 205;
const int MOD = 998244353;
int N;
int x[MAXN], y[MAXN];
int pot[MAXN];
void load() {
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d%d", x + i, y + i);
}
inline int add(int x, int y) {
x += y;
if (x >= MOD)
x -= MOD;
else if (x < 0)
x += MOD;
return x;
}
int ccw(int a, int b, int c) {
return x[a] * (y[b] - y[c]) + x[b] * (y[c] - y[a]) + x[c] * (y[a] - y[b]);
}
bool in_range(int a, int b, int c) {
return c >= min(a, b) && c <= max(a, b);
}
int solve() {
pot[0] = 1;
for (int i = 1; i <= N; i++)
pot[i] = add(pot[i - 1], pot[i - 1]);
int sol = add(pot[N], -N - 1);
for (int i = 0; i < N; i++)
for (int j = 0; j < i; j++) {
int cnt = 0;
for (int k = 0; k < N; k++)
cnt += k != i && k != j && !ccw(i, j, k) && in_range(x[i], x[j], x[k]) && in_range(y[i], y[j], y[k]);
sol = add(sol, -pot[cnt]);
}
return sol;
}
int main() {
load();
printf("%d\n", solve());
return 0;
}
./Main.cpp: In function ‘void load()’:
./Main.cpp:13:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &N);
^
./Main.cpp:15:30: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", x + i, y + i);
^