#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
#define ll long long
#define MOD 1000000007
#define nl cout<<endl
#define rt ll Q[100005]={0}
#define mp make_pair
#define test() ull t;cin>>t;while(t--)
#define pb push_back
#define ff first
#define ss second
#define all(v) v.begin(),v.end()
#define oa(a,n) for(ll i=0;i<n;i++)cout<<a[i]<<" ";nl
#define cn(a,n) for(ll i=0;i<n;i++)cin>>a[i];
#define ov(a,n) for(ll i=0;i<n;i++)cout<<a[i]<<" ";nl
#define fastio() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
ll gcd(ll a, ll b)
{
    if (!b)
        return a;
    return gcd(b, a % b);
}
ll powe(ll x, ll y,ll m)
{
    if(y==0)
        return 1;
    else
    {
        ll t = powe(x,y/2,m)%m;
        if(y%2==0)
            return (t*t)%m;
        else
            return (((t*t)%m)*x)%m;
    }
}
string itb(ll n)
{
    string s="";
    while(n>0)
    {
        ll d = n%2;
        s = (char)(d+48)+s;
        n=n/2;
    }
    return s;
}

bool parity(int a, int b)
{
    if(a%2==0 && b%2==0)
        return false;
    else if(a%2==1 && b%2==1)
        return false;
    else
        return true;
}
void build(int node,int start,int end,int tree[],int a[])
{
    if(start==end)
    {
        tree[node]=a[start];
    }
    else
    {
        int mid= (start+end)/2;
        build(2*node,start,mid,tree,a);
        build(2*node+1,mid+1,end,tree,a);
        tree[node] = min(tree[2*node+1],tree[2*node]);
    }
}
void update(int node,int start,int end,int idx,int val,int tree[],int a[])
{
    if(start==end)
    {
        a[idx]=val;
        tree[node]=val;
    }
    else
    {
        int mid = (start + end) / 2;
        if(start <= idx && idx <= mid)
        {
            update(2*node, start, mid, idx, val,tree,a);
        }
        else
        {
            update(2*node+1, mid+1, end, idx, val,tree,a);
        }
        tree[node] = min(tree[2*node+1],tree[2*node]);
    }
}
int query(int node, int start, int end, int l, int r,int tree[])
{
    if(r < start || end < l)
    {
        return 100005;
    }
    if(l <= start && end <= r)
    {
        return tree[node];
    }
    int mid = (start + end)/2;
    int p1 = query(2*node, start, mid, l, r,tree);
    int p2 = query(2*node+1, mid+1, end, l, r,tree);
    return min(p1,p2);
}
int bs_lower_bound(int a[], int n, int x) {
    int l = 0;
    int h = n;
    while (l < h) {
        int mid = (l + h) / 2;
        if (x <= a[mid]) {
            h = mid;
        } else {
            l = mid + 1;
        }
    }
    if(l>=n)
        l=-1;
    return l;
}
int main()
{
    fastio();
    
    int n;
    cin>>n;
    double a[2][n];
    for(int i=0;i<n;i++)
    {
        cin>>a[0][i]>>a[1][i];
    }
    vector <double> v;
    double f=1;
    for(double i=2;i<n;i++)
        f=f*i;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            double d = (a[0][i]-a[0][j])*(a[0][i]-a[0][j]) + (a[1][i]-a[1][j])*(a[1][i]-a[1][j]);
            d= sqrt(d);
            d = d*f*2;
            v.pb(d);
        }
    }
    double sum=0;
    for(int i=0;i<=v.size();i++)
        sum+=v[i];
    sum = sum/(f*n);
    cout << fixed << setprecision(15) << sum <<endl;

}   

Measured memory_bytes: 256