using System;
using System.Collections.Generic;
using System.Windows;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Atcoder
{
    public class Program
    {
        static void Main(string[] args)
        {
            var N = Read().ToInt32();
            var l = new Dictionary<int, Tuple<double, double>>();
            for (int i = 0; i < N; i++)
            {
                var r = ReadSplit();
                var x = r[0].ToInt32();
                var y = r[1].ToInt32();
                l.Add(i, new Tuple<double, double>(x, y));
            }

            var list = new List<int>();
            for (int i = 0; i < N; i++)
            {
                list.Add(i);
            }
            var aa = Permutations(list, N);
            double sum = 0;
            foreach (var item in aa)
            {
                int? pre = null;
                for (int i = 0; i < N; i++)
                {
                    var cur = item[i];
                    if (!pre.HasValue)
                    {
                        pre = cur;
                        continue;
                    }
                    var r1 = l[pre.Value];
                    var r2 = l[cur];
                    sum += Math.Sqrt(Math.Pow(r1.Item1 - r2.Item1, 2) + Math.Pow(r1.Item2 - r2.Item2, 2));
                    pre = cur;
                }
            }
            var ans = sum / aa.Count;
            WriteRead(ans);
        }

        private static List<List<T>> Permutations<T>(List<T> src, int n)
        {
            // nは1以上かつsrcの長さよりも短い必要がある。
            int len = src.Count;
            if (!(0 < n && n <= len))
            {
                throw new ArgumentOutOfRangeException();
            }

            var permutations = new List<List<T>>();
            var queue = new Queue<List<int>>(Enumerable.Range(0, len).Select(i => new List<int>() { i }));
            while (queue.Any())
            {
                var indexes = queue.Dequeue();

                if (indexes.Count == n)
                {
                    permutations.Add(indexes.Select(index => src[index]).ToList());
                    continue;
                }

                for (int index = 0; index < len; index++)
                {
                    if (indexes.Contains(index))
                    {
                        continue;
                    }

                    var newIndexes = new List<int>(indexes);
                    newIndexes.Add(index);
                    queue.Enqueue(newIndexes);
                }
            }

            return permutations;
        }

        public static string Read()
        {
            return Console.ReadLine();
        }

        public static string[] ReadSplit()
        {
            return Console.ReadLine().Split(' ');
        }

        public static void WriteRead(object str)
        {
            Console.WriteLine(str);
            Read();
        }

        public static void Write(object str)
        {
            Console.WriteLine(str);
        }
    }
}


public static class Extentions
{
    public static int ToInt32(this object obj)
    {
        return int.Parse(obj.ToString());
    }

    public static long ToInt64(this object obj)
    {
        return long.Parse(obj.ToString());
    }

    public static decimal ToDecimal(this object obj)
    {
        return decimal.Parse(obj.ToString());
    }

    public static double ToDouble(this object obj)
    {
        return double.Parse(obj.ToString());
    }

    public static T2 GetValueZero<T1, T2>(this Dictionary<T1, T2> d, T1 key) where T2 : struct
    {
        T2 value;
        if (d.TryGetValue(key, out value))


        {
            return value;
        }
        return new T2();
    }
}



Measured memory_bytes: 36184