#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <sstream>
#include <string>
#define _repargs(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);++i)
#define rep(...) _repargs(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)
#define all(x) (x).begin(),(x).end()
#define mod 998244353
#define inf 2000000007
#define mp make_pair
#define pb push_back
typedef long long ll;
using namespace std;
template <typename T>
inline void output(T a, int p = 0) {
    if(p) cout << fixed << setprecision(p)  << a << "\n";
    else cout << a << "\n";
}
// end of template

ll f[220];
ll comb[220][220];

void fact() {
    f[0] = 1;
    rep(i, 1, 210){
        f[i] = f[i - 1] * i;
        f[i] %= mod;
    }
}

ll pow_mod(ll a, ll b, ll m){
    ll ret = 1;
    while (b > 0) {
        if (b & 1) {
            ret = ret * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return ret;
}

ll inv_mod(ll a, ll m){
    return pow_mod(a, m - 2, m);
}

void calc() {
    // i C j
    rep(i, 210){
        rep(j, i + 1) {
            comb[i][j] = f[i];
            ll tmp = inv_mod(f[j] * f[i - j] % mod, mod);
            (comb[i][j] *= tmp) %= mod;
        }
    }
}


bool line(pair<ll, ll> p, pair<ll, ll> q, pair<ll, ll> r){
    return (p.first - q.first) * (p.second - r.second) == (p.first - r.first) * (p.second - q.second);
}

bool vis[220][220];

// union find
class union_find {
public:
    int n;
    vector<int> parent, rnk, num;
    
    union_find(int n) : n(n), parent(n), rnk(n, 0), num(n, 1) {rep(i, n) parent[i] = i; }
    
    int root(int x){ return (parent[x] == x) ? x : root(parent[x]); }
    
    void unite(int x, int y){
        x = root(x);
        y = root(y);
        if (x == y) {
            return;
        }
        if (rnk[x] < rnk[y]) {
            parent[x] = y;
            num[y] += num[x];
        }
        else{
            parent[y] = x;
            num[x] += num[y];
            if (rnk[x] == rnk[y]) {
                rnk[x]++;
            }
        }
        n--;
    }
    
    bool same(int x, int y) {return root(x) == root(y);}
    
    int count(int x){ return num[root(x)]; }
};

int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    // source code
    fact();
    calc();
    int N;
    cin >> N;
    vector<pair<ll, ll>> A(N);
    rep(i, N) cin >> A[i].first >> A[i].second;
    
    ll ans = 0;
    rep(i, 3, N + 1){
        ans += comb[N][i];
        ans %= mod;
    }
    
    ll sub = 0;
    rep(i, N){
        rep(j, i + 1, N){
            int cnt = 2;
            
            rep(k, N){
                if(k == i || k == j) continue;
                if(line(A[i], A[j], A[k])){
                    cnt++;
                }
            }
//            cout << i << "," << j << ":" << cnt << endl;
            if(cnt > 2){
                ll tmp = 0;
                rep(l, 3, cnt + 1){
                    tmp += comb[cnt][l];
                    tmp %= mod;
                }
                tmp *= inv_mod(comb[cnt][2], mod);
                tmp %= mod;
                sub += tmp;
                sub %= mod;
                
            }
        }
    }
//    output(sub);
    ans = ans - sub;
    ans %= mod;
    ans += mod;
    ans %= mod;
    output(ans);
    
    
    return 0;
}

Measured memory_bytes: 640