/*
     AUTHOR : Ankit Kumar
     BRANCH : Information Technology
     INSTITUTE : Birla Institute of Technology
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp>
#include <functional> // for less
using namespace std;
using namespace __gnu_pbds;
//typedef tree<pair<int,int>, null_type, less<pair<int,int>>, rb_tree_tag,
//             tree_order_statistics_node_update>
//    new_data_set;
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define pb push_back
#define MP make_pair
#define SET(a,val) memset(a,val,sizeof(a))
#define deci(n)         cout<<fixed<<setprecision(n);
#define show(a,l,r) for(int i=l;i<r;i++) cout<<a[i]<<" ";
#define all(a) (a).begin(), (a).end()
const int N=50003;
const int dx[] = {-1, 0, 1, 0, -1,-1, 1, 1};
const int dy[] = { 0, 1, 0,-1, -1, 1,-1, 1};
char dir[]={'L','D','R','U'};
//int dx[]={2,-2,1,-1,2,-2,1,-1};//for knights
//int dy[]={1,1,2,2,-1,-1,-2,-2};
typedef long long int ll;
const ll mod=1e9+7;
const ll inf=1e18+100;
int BIT[50005];
//int prime[17],spf[17];
template<typename T>T lcm(T a, T b) {return a / gcd(a,b) * b;}
template<typename T> T min3(T a,T b,T c) {return min(a,min(b,c));}
//template<typename T> T min(T a,T b) {if(a>b) return b; else return a;}
template<typename T> T max3(T a,T b,T c) {return max(a,max(b,c));}
bool isVowel(char ch){ ch=toupper(ch); if(ch=='A'||ch=='U'||ch=='I'||ch=='O'||ch=='E') return true; return false;}
ll mInv(ll a, ll m)
{
    ll m0 = m;
    ll y = 0, x = 1;
    if (m == 1)
      return 0;
    while (a > 1)
    {
        ll q = a / m;
        ll t = m;
        m = a % m, a = t;
        t = y;
        y = x - q * y;
        x = t;
    }
    if (x < 0)
       x += m0;
return x;
}
ll power(ll x, ll y)
{
    ll res = 1;
    x = x % mod;
    while (y > 0)
    {
        if (y & 1)
            res = (res*x) % mod;
        y = y>>1;
        x = (x*x)% mod;
    }
    return res;
}
ll gcd(ll a,ll b)
{
    if(b==0)
        return a;
    return (b,a%b);
}
void update(int x, int delta)
{
    if(!x)
    {
        BIT[x]+=delta;
        return;
    }
      for(; x <= N; x += x&-x)
        BIT[x] += delta;
}
int query(int x)
{
     ll sum = BIT[0];
     for(; x > 0; x -= x&-x)
        sum += BIT[x];
     return sum;
}
/*void Sieve()
{
    for(int i=1;i<=N;i++)
        prime[i]=1;
    prime[0]=0;
    prime[1]=0;
    for (ll p=2; p*p<=N; p++)
    {
        if (prime[p] == 1)
        {
            for (ll i=p*p; i<=N; i += p)
                prime[i] = 0;
        }
    }
    for(int p=3;p<=N;p++)
        prime[p]+=prime[p-1];
}
void sieve()
{
    spf[1] = 1;
    for (int i=2; i<N; i++)
        spf[i] = i;
    for (int i=4; i<N; i+=2)
        spf[i] = 2;
    for (ll i=3; i*i<N; i++)
    {
        if (spf[i] == i)
        {
            for (ll j=i*i; j<N; j+=i)
                if (spf[j]==j)
                    spf[j] = i;
        }
    }
}
                         /******************Lets Code*******************/
int last[1000002];
int main()
{
    int n;
  cin>>n;
  pair<int,int>a[n];
  for(int i=0;i<n;i++)
  {
    cin>>a[i].first>>a[i].second;
  }
  vector<int>v;
  for(int i=0;i<n;i++)
    v.push_back(i);
    double sum=0.0;
  do {

        for(int i=0;i<n-1;i++)
        {
          double x=pow(a[v[i]].first-a[v[i+1]].first,2);
          double y=pow(a[v[i]].second-a[v[i+1]].second,2);
          x=x+y;
          double z=(double)sqrt(x);
          sum=sum+z;
        }
    } while (next_permutation(v.begin(),v.end()));
  ll fact=1;
  for(int i=2;i<=n;i++)
    fact=fact*i;
  double ans=sum/(double)fact;
  cout<<fixed<<setprecision(12)<<ans<<"\n";
  return 0;
}


Measured memory_bytes: 256