#include <bits/stdc++.h>

using namespace std;
struct point
{
    long long x, y;
};
bool cmp(point a, point b)
{
    return a.y<b.y;
}
long long n;
point p[200000];
long long S(point a, point b, point c)
{
    return (b.x-a.x)*(a.y+b.y)+(c.x-b.x)*(b.y+c.y)-(c.x-a.x)*(c.y+a.y);
}
bool G(point a, point b)
{
    return a.x==b.x && a.y==b.y;
}
long long f(point a)
{
    long long res=0;
    vector < point > v1, v2;
    point b=p[0], c=p[n-1];
    if (G(a, p[0])) b=p[1];
    if (G(a, p[n-1])) c=p[n-2];
    for (long long i=0; i<n; i++)
    {
        if (!G(p[i], a) && !G(p[i], b) && !G(p[i], c))
        {
            if (S(b, p[i], c)>0) v1.push_back(p[i]);
            else v2.push_back(p[i]);
        }
    }
    point k=b;
    vector < point > v;
    if (v1.size()>0) v.push_back(v1[0]);
    long long i=0, j=1, r=1;
    while (j<v1.size())
    {
        long long d=r;
        while (j<v1.size() && S(b, v1[i], v1[j])>0)
        {
            v.push_back(v1[j]);
            r++;
            j++;
        }
        if (j<v1.size())
        {
            r=d;
            i=j;
            j++;
        }
    }
    i=0; j=1;
    while (j<v2.size())
    {
        long long d=r;
        while (j<v2.size() && S(b, v2[i], v2[j])<0)
        {
            v.push_back(v2[j]);
            r++;
            j++;
        }
        if (j<v2.size())
        {
            r=d;
            i=j;
            j++;
        }
    }
    return r;
}
long long GCD(long long a, long long b)
{
    long long t;
    while (a>0)
    {
        t=a;
        a=b%a;
        b=t;
    }
    return b;
}
int main()
{
    cin >> n;
    for (long long i=0; i<n; i++) cin >> p[i].x >> p[i].y;
    sort(p, p+n, cmp);
    long long k=0;
    for (long long i=0; i<n; i++)
    {
        k=k+f(p[i]);
    }
    long long m=GCD(k, n);
    k=k/m;
    n=n/m;
    cout << k << " " << n;
    return 0;
}
