#include <bits/stdc++.h>
using namespace std;
#define TR(i,v)         for(__typeof((v).begin())i=(v).begin();i!=(v).end();++i)
#define DEBUG(x)        cout << #x << " = " << (x) << endl;
#define SIZE(p)         (int)(p).size()
#define MP(a, b)        make_pair((a), (b))
#define ALL(p)          (p).begin(), (p).end()
#define rep(i, n)       for(int (i)=0; (i)<(int)(n); ++(i))
#define REP(i, a, n)    for(int (i)=(a); (i)<(int)(n); ++(i))
#define FOR(i, a, b)    for(int (i)=(int)(a); (i)<=(int)(b); ++(i))
#define FORD(i, b, a)   for(int (i)=(int)(b); (i)>=(int)(a); --(i))
#define CLR(x, y)       memset((x), (y), sizeof((x)))
typedef long long LL;
typedef pair<int, int> pii;
struct Point {
    LL x,y; int id;
    Point() {}
    Point(LL x,LL y):   x(x),y(y)   {}
    void read(int k) {
        cin>>x>>y;  id=k;
    }
    bool operator<(const Point&rhs) const {
        return x<rhs.x || (x==rhs.x && y<rhs.y);
    }
    bool operator==(const Point&rhs) const {
        return x==rhs.x && y==rhs.y;
    }
};
typedef Point Vector;
Vector operator-(const Point&a,const Point&b) {
    return Vector(a.x-b.x,a.y-b.y);
}
LL Cross(const Vector&a,const Vector&b) {
    return a.x*b.y-a.y*b.x;
}
const int maxn=200005;
Point P[maxn],CH[maxn];
int getch(Point *p,Point *h,int n) {
    sort(p,p+n);
    int m=0;
    rep(i,n) {
        while(m>1 && Cross(p[i]-h[m-2],h[m-1]-h[m-2])>=0)   --m;
        h[m++]=p[i];
    }
    int mm=m;
    FORD(i,n-2,0) {
        while(m>mm && Cross(p[i]-h[m-2],h[m-1]-h[m-2])>=0)  --m;
        h[m++]=p[i];
    }
    if(n>1) --m;
    return m;
}
inline bool inTri(Point p,int a,int b,int c) {    
    return Cross(p-P[a],P[b]-P[a])<=0 && Cross(p-P[b],P[c]-P[b])<=0 && Cross(p-P[c],P[a]-P[c])<=0;
}
int main(int argc, char const *argv[]) {
    freopen("average.in", "r", stdin);
    freopen("average.out", "w", stdout);
    ios::sync_with_stdio(false);        cin.tie(0);
    int n;  cin>>n;
    rep(i,n)    P[i].read(i);
    int m=getch(P,CH,n);
    if(m==1)    return puts("0/1"),0;
    if(m==2)    return puts("2/1"),0;    
    LL A=0,B=n;
    rep(i,m) {
        int pre=(i+m-1)%m,now=i,nxt=(i+1)%m;
        int a=lower_bound(P,P+n,CH[pre])-P;
        int b=lower_bound(P,P+n,CH[now])-P;
        int c=lower_bound(P,P+n,CH[nxt])-P;
        int l=min(a,min(b,c)),r=max(a,max(b,c));
        static Point cp[maxn],cph[maxn];  int cplen=0;        
        FOR(k,l,r) if(inTri(P[k],a,b,c) && !(P[k]==P[b]))
            cp[cplen++]=P[k];
        A+=getch(cp,cph,cplen)-2+m-1;
    }
    A+=(LL)(n-m)*m;
    LL g=__gcd(A,B);    A/=g,B/=g;
    printf("%lld/%lld\n",A,B);
    return 0;
}