#include <bits/stdc++.h>

using namespace std;

const bool debug = true;
#define dbg(...) if(debug) printf(__VA_ARGS__)
#define print(var) if (debug) cout << #var << " = " << var << endl
/** whole range */
#define whole(xs) (xs).begin(), (xs).end()

namespace {
    template<typename T> istream& operator>>(istream& is, vector<T>& xs) { for (auto& x : xs) is >> x; return is; }
    using ll = long long;
    using real = double;
    const real EPS = 1e-6;

    template<ll mod> ll modpow(ll n, ll k) {
        if (k == 0) return 1LL;
        if (k % 2 == 0) return modpow<mod>(n * n % mod, k / 2);
        return modpow<mod>(n, k - 1) * n % mod;
    }
    template<ll mod> ll inverse(ll n) { return modpow<mod>(n, mod - 2); }

    struct Point {
        real x, y;
        Point() {}
        Point(real x, real y) : x(x), y(y) {}
        Point operator+(const Point& p) const { return Point(x + p.x, y + p.y); }
        Point operator-(const Point& p) const { return Point(x - p.x, y - p.y); }
        Point operator*(real k) const { return Point(k * x, k * y); }
        Point operator/(real k) const { return Point(x / k, y / k); }
    };
    real dot(const Point& a, const Point& b) { return a.x * b.x + a.y * b.y; }
    real cross(const Point& a, const Point& b) { return a.x * b.y - a.y * b.x; }
    real norm(const Point& a) { return sqrt(dot(a, a)); }
    Point rot90(const Point& p) { return Point(-p.y, p.x); }  // 反時計回りに90度回転
    real angle(const Point& a) { return atan2(a.y, a.x); }  // x軸を反時計回りに何ラジアン回転させれば点aに乗るか
    ostream& operator<<(ostream& os, const Point& p) { return os << "(" << p.x << "," << p.y << ")"; }
    istream& operator>>(istream& is, Point& p) { return is >> p.x >> p.y; };
    int ccw(Point a, Point b, Point c) {
        b = b - a;
        c = c - a;
        if (cross(b, c) > EPS) return +1;   // a,b,cの順に反時計周り
        if (cross(b, c) < -EPS) return -1;  // a,b,cの順に時計周り
        if (dot(b, c) < 0) return +2;       // c--a--b 直線
        if (norm(b) < norm(c)) return -2;   // a--b--c 直線
        return 0;                           // a--c--b 直線
    }
    struct Line {
        Point a, b;
        Line() {}
        Line(const Point& a, const Point& b) : a(a), b(b) {}
    };
    bool contains(const Line& l, const Point& p) { return ccw(l.a, l.b, p) % 2 == 0; }
    bool parallel(const Line& s, const Line& t) { return abs(cross(s.b - s.a, t.b - t.a)) < EPS; }
    bool orthogonal(const Line& s, const Line& t) { return abs(dot(s.b - s.a, t.b - t.a)) < EPS; }
    bool equals(const Line& s, const Line& t) { return parallel(s, t) && contains(s, t.a); }
    Point crosspoint(const Line& s, const Line& t) {
        real d = cross(t.b - t.a, s.b - s.a);
        assert(abs(d) >= EPS);
        return s.a + (s.b - s.a) * cross(t.b - t.a, t.b - s.a) / d;
    }
    ostream& operator<<(ostream& os, const Line& l) {
        return os << "Line(" << l.a << ", " << l.b << ")";
    }

    int N;
    vector<Point> ps;
    void input() {
        cin >> N;
        ps.resize(N);
        cin >> ps;
    }
    const ll mod = 998244353;
    void solve() {
        vector<Line> lines;
        for (int i = 0; i < N; i++) {
            for (int j = i + 1; j < N; j++) {
                auto& a = ps[i];
                auto& b = ps[j];
                lines.emplace_back(a, b);
            }
        }
        vector<Line> nlines;
        vector<bool> used(lines.size(), false);
        for (int i = 0; i < lines.size(); i++) {
            if (used[i]) continue;
            nlines.push_back(lines[i]);
            for (int j = i + 1; j < lines.size(); j++) {
                if (equals(lines[i], lines[j])) used[j] = true;
            }
        }
        lines = nlines;
        vector<ll> count(lines.size(), 0);
        for (int i = 0; i < lines.size(); i++) {
            auto& line = lines[i];
            for (int k = 0; k < N; k++) {
                if (contains(line, ps[k])) {
                    count[i]++;
                }
            }
        }
        auto c = [&](ll n) {
            return (modpow<mod>(2LL, n) + (mod - 1) + (mod - n) + (mod - (n * (n - 1) / 2) % mod)) % mod;
        };
        ll ans = c(N);
        for (int i = 0; i < lines.size(); i++) {
            auto& cnt = count[i];
            ans = (ans + mod - c(cnt)) % mod;
        }
        cout << ans << endl;
    }
}

int main() {
    input(); solve();
    return 0;
}



Measured memory_bytes: 2552