#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define mp make_pair
#define PI pair<ll,ll>
#define poly vector<ll>
#define mem(a) memset((a),0,sizeof(a))
#define For(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define Rep(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))
inline char gc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
inline ll read(){
	ll x = 0; char ch = gc(); bool positive = 1;
	for (; !isdigit(ch); ch = gc())	if (ch == '-')	positive = 0;
	for (; isdigit(ch); ch = gc())	x = x * 10 + ch - '0';
	return positive ? x : -x;
}
inline void write(ll a){
    if(a<0){
    	a=-a; putchar('-');
	}
    if(a>=10)write(a/10);
    putchar('0'+a%10);
}
inline void writeln(ll a){write(a); puts("");}
inline void wri(ll a){write(a); putchar(' ');}
inline ull rnd(){
	return ((ull)rand()<<30^rand())<<4|rand()%4;
}
int get(PI a){
	return a.se>=0?a.fi:a.fi-a.se;
}
bool cmp(PI a,PI b){
	int A=get(a),B=get(b);
	return A<B;
}
const int N=100005;
int n,k;
PI a[N];
ll sum;
int main(){
	#ifdef Brollan
		freopen("1.in","r",stdin);
	#endif
	n=read();
	For(i,1,n){
		a[i].fi=read(); a[i].se=read()-a[i].fi;
		a[i].fi+=a[i].se;
		if(a[i].se>=0){
			sum+=a[i].se;
		}
	}
	sort(a+1,a+n+1,cmp);
	//cout<<sum<<" "<<get(a[1])<<" "<<get(a[2])<<endl;
	For(i,1,n)if(sum>=get(a[i])){
		sum-=get(a[i]); k++;
	}else{
		PI ans=mp(0,1);
		For(j,i,n){
			PI zs;
			if(a[j].se>=0)zs=mp(sum,a[j].fi);
			else zs=mp(sum+a[j].se,a[j].fi);
			if(zs.fi*ans.se>ans.fi*zs.se)ans=zs;
		}
		ans.fi+=k*ans.se; ans.se*=n;
		ll t=__gcd(ans.fi,ans.se); ans.fi/=t; ans.se/=t;
		cout<<ans.fi<<" "<<ans.se<<endl;
		return 0;
	}
}
