package main

import (
	"fmt"
	"strings"
	"bufio"
	"os"
	"strconv"
)

type point struct {
	x, y int
}

type points []point

func permutation(n int, k int) int {
	v := 1
	if 0 < k && k <= n {
		for i := 0; i < k; i++ {
			v *= (n - i)
		}
	} else if k > n {
		v = 0
	}
	return v
}

func factorial(n int) int {
	return permutation(n, n-1)
}

func combination(n int, k int) int {
	return permutation(n, k) / factorial(k)
}

func homogeneous(n int, k int) int {
	return combination(n+k-1, k)
}
func calc1(ai point, ps points) int {

	if len(ps) == 0 {
		return 0
	}
	res := 0
	for i := 0; i < len(ps); i++ {
		res = res + calc3(ai, ps[i])
	}
	ret := calc2(len(ps)) - calc2(res)

	return ret

}

func calc3(ai, aj point) int {
	res := ai.x*aj.x + ai.y*aj.y
	if res == 0 {
		return 1
	}
	return 0

}

//組み合わせ
func calc2(n int) int {
	res := 0
	for i := 0; i < n; i++ {
		res = res + combination(n, i)
	}
	return res
}
func calc4(ps points) int {
	ret := 0
	for i := 0; i < len(ps); i++ {
		ret = ret + calc1(ps[i], ps[1:])
	}
	return ret
}

var rdr = bufio.NewReaderSize(os.Stdin, 1000000)

func readLine() string {
	buf := make([]byte, 0, 1000000)
	for {
		l, p, e := rdr.ReadLine()
		if e != nil {
			panic(e)
		}
		buf = append(buf, l...)
		if !p {
			break
		}
	}
	return string(buf)
}
func atoi(str string) int {
	 i,_:=strconv.Atoi(str)
	 return i
}
func main() {
	n:= atoi( readLine())
	l:= make(points,0)
	for i:=0;i<n;i++{
		l1:= strings.Split( readLine()," ")
		l = append(l, point{
			 atoi(l1[0]),
			atoi(l1[1]),
		})
	}
	ret:= calc4(l)
	fmt.Println(ret)

}
