#include <bits/stdc++.h>
using namespace std;

#define NDEBUG
#ifdef DEBUG
#include "../cout11.h"
#undef NDEBUG
#endif
#include <cassert>

typedef long long ll;
typedef long double Double;
typedef unsigned long long ull;
typedef pair<int,int> ii;
typedef pair<ll,ll> llll;
typedef pair<double,double> dd;

typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<long double> vD;

#define sz(a)  int((a).size())
#define pb  push_back
#define FOR(var,from,to) for(int var=(from);var<=(to);++var)
#define rep(var,n)  for(int var=0;var<(n);++var)
#define rep1(var,n)  for(int var=1;var<=(n);++var)
#define repC2(vari,varj,n)  for(int vari=0;vari<(n)-1;++vari)for(int varj=vari+1;varj<(n);++varj)
#define ALL(c)  (c).begin(),(c).end()
#define RALL(c)  (c).rbegin(),(c).rend()
#define tr(i,c)  for(auto i=(c).begin(); i!=(c).end(); ++i)
#define found(s,e)  ((s).find(e)!=(s).end())
#define mset(arr,val)  memset(arr,val,sizeof(arr))
#define mid(x,y) ((x)+((y)-(x))/2)
#define IN(x,a,b) ((a)<=(x)&&(x)<=(b))
#define cons make_pair


ll gcd(ll a, ll b) { while(a) swap(a, b%=a); return b; }

const ll MOD=998244353LL;

ll ADD(ll x, ll y) { return (x+y) % MOD; }
ll SUB(ll x, ll y) { return (x-y+MOD) % MOD; }
ll MUL(ll x, ll y) { return x*y % MOD; }
ll POW(ll x, ll e) { ll v=1; for(; e; x=MUL(x,x), e>>=1) if (e&1) v = MUL(v,x); return v; }
ll DIV(ll x, ll y) { /*assert(y%MOD!=0);*/ return MUL(x, POW(y, MOD-2)); }
// ll comb(ll n, ll k) { ll v=1; for(ll i=1; i<=k; i++) v = DIV(MUL(v, n-i+1),i); return v; }
//

typedef tuple<double,double,double> LINE;

void render_fnum(FILE* fp, double x) {
    if (x == 1) return;
    fprintf(fp, "%g", x);
}
void render_line(FILE* fp, LINE& line) {
    double a,b,c; tie(a,b,c) = line;
    if (a != 0){
        render_fnum(fp, a);
        fprintf(fp, "x");
    }

    if (b != 0) {
        if (b > 0) {
            if (a != 0)
                fprintf(fp, " + ");
            render_fnum(fp, b);
        } else if (b < 0) {
            fprintf(fp, " - ");
            render_fnum(fp, -b);
        }
        fprintf(fp, "y");
    }

    if (c != 0) {
        if (c > 0) {
            fprintf(fp, " + %g", c);
        } else if (c < 0) {
            fprintf(fp, " - %g", -c);
        }
    }

    fprintf(fp, " = 0");
}

LINE get_line(ii& p0, ii& p1){
    int x0 = p0.first, y0 = p0.second,
        x1 = p1.first, y1 = p1.second;
    int dx = x1 - x0, dy = y1 - y0;

    assert(dx != 0 || dy != 0);

    double a, b, c;

    if (dx == 0) {
        // 1x [+ 0y] - some = 0
        // some = x
        // double some = (double)x0;
        a = 1.0;
        b = 0.0;
        c = (double)(-x0); // -some;
    } else if (dy == 0) {
        // [0x +] 1y - some = 0
        // some = y
        // double some = (double)y0;
        a = 0.0;
        b = 1.0;
        c = (double)(-y0); // -some;
    } else {
        // m = dy/dx
        // y = mx + b
        // mx - y + b = 0
        int g = gcd(dx, dy);
        dx /= g; dy /= g;

        double _m = (double)dx / dy;
        assert(_m != 0.0);
        // x - _my - some = 0
        // double some = (double)x0 - _m * y0;
        a = 1.0;
        b = -_m;
        c = (double)(_m * y0 - x0); // -some;
    }

    // fprintf(stderr, "(a,b,c)=(%g,%g,%g)\n", a,b,c);

    double z0 = a * x0 + b * y0 + c;
    double z1 = a * x1 + b * y1 + c;
#ifdef DEBUG
    // fprintf(stderr, "%g * %d + %g * %d + %g = %g\n", a,x0, b,y0, c, z0);
    // fprintf(stderr, "%g * %d + %g * %d + %g = %g\n", a,x1, b,y1, c, z1);
#endif
    assert(fabs(z0) < 1e-7);
    assert(fabs(z1) < 1e-7);

    return LINE(a, b, c);
}


ll f(int n){
    // return (1 << n) - n - 1;
    return SUB(POW(2, n), ADD(n,1));
}

ll solve(int N, vii& p){
    // map<LINE, set<int>> by_line;
    map<vector<ll>, set<int>> by_line;

    repC2(i,j,N){
#ifdef DEBUG
        // cerr << "---" << endl;
        // fprintf(stderr, "[%d %d] ", i, j);
        // cerr << p[i] << " " << p[j] << " : ";
#endif
        LINE line = get_line(p[i], p[j]);
#ifdef DEBUG
        // render_line(stderr, line);
        // cerr << endl;
#endif

        double a,b,c; tie(a,b,c) = line;
        vector<ll> _line { (ll)round(1e8*a), (ll)round(1e8*b), (ll)round(1e8*c) };
        by_line[_line].insert(i);
        by_line[_line].insert(j);
    }

    ll ans = f(N); // (1 << N) - (N+1);
    for(auto p: by_line){
        // LINE line = p.first;
        vector<ll> _line = p.first;
        set<int> s = p.second;
        int k = p.second.size();
#ifdef DEBUG
        render_line(stderr, line);
        cerr << " : " << s << endl;
#endif
        ans = SUB(ans, f(k)); // (1 << k) - (k+1));
    }
    return ans;
}

int main() {
    int N; scanf("%d", &N);
    vector<ii> p(N);
    rep(i,N){
        int x, y;
        scanf("%d %d", &x, &y);
        p[i] = ii(x, y);
    }

    cout << solve(N,p) << endl;
    return 0;
}


Measured memory_bytes: 4864