#include <stdio.h>
#include <string.h>
#include <algorithm>
const int kN = 200 + 5;
const int MOD = 998244353;
int n;
struct Point {
int x, y;
Point() {}
Point(int x, int y): x(x), y(y) {}
Point operator - (const Point &rhs) const
{
return Point(x - rhs.x, y - rhs.y);
}
void read()
{
scanf("%d%d", &x, &y);
}
bool operator < (const Point &rhs) const
{
return x < rhs.x || x == rhs.x && y < rhs.y;
}
};
int det(const Point &a, const Point &b)
{
return a.x * b.y - a.y * b.x;
}
int det(const Point &a, const Point &b, const Point &c)
{
return det(b - a, c - a);
}
int inverse(int x)
{
return x == 1 ? x : (MOD - MOD / x) * 1ll * inverse(MOD % x) % MOD;
}
inline void add(int &a, int b)
{
a += b;
if (a < 0) a += MOD;
else if (a >= MOD) a -= MOD;
}
inline int mul(int x)
{
return x;
}
template<typename... Args>
inline int mul(int x, Args... args)
{
return x * 1ll * mul(args...) % MOD;
}
Point pt[kN];
int pw[kN];
int work()
{
pw[0] = 1;
for (int i = 1; i < kN; ++ i)
pw[i] = mul(pw[i - 1], 2);
int ret = pw[n];
add(ret, -1 - n);
for (int i = 0; i < n; ++ i) {
for (int j = i + 1; j < n; ++ j) {
int cnt = 0;
for (int k = j + 1; k < n; ++ k)
if (det(pt[i], pt[j], pt[k]) == 0)
++ cnt;
add(ret, -pw[cnt]);
}
}
return ret;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; ++ i)
pt[i].read();
printf("%d\n", work());
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:90:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
^
./Main.cpp: In member function ‘void Point::read()’:
./Main.cpp:23:30: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &x, &y);
^