Problem:
Score: 600 points

Problem Statement

E869120 is initially standing at the origin (0, 0) in a two-dimensional plane.

He has N engines, which can be used as follows:

When E869120 uses the i-th engine, his X- and Y-coordinate change by x_i and y_i, respectively. In other words, if E869120 uses the i-th engine from coordinates (X, Y), he will move to the coordinates (X + x_i, Y + y_i).

E869120 can use these engines in any order, but each engine can be used at most once. He may also choose not to use some of the engines.

He wants to go as far as possible from the origin.
Let (X, Y) be his final coordinates. Find the maximum possible value of \sqrt{X^2 + Y^2}, the distance from the origin.

Constraints

1 \leq N \leq 100

-1 \ 000 \ 000 \leq x_i \leq 1 \ 000 \ 000

-1 \ 000 \ 000 \leq y_i \leq 1 \ 000 \ 000

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1
x_2 y_2
: :
x_N y_N

Output

Print the maximum possible final distance from the origin, as a real value.
Your output is considered correct when the relative or absolute error from the true answer is at most 10^{-10}.

Sample Input 1

3
0 10
5 -5
-5 -5

Sample Output 1

10.000000000000000000000000000000000000000000000000

The final distance from the origin can be 10 if we use the engines in one of the following three ways:

Use Engine 1 to move to (0, 10).

Use Engine 2 to move to (5, -5), and then use Engine 3 to move to (0, -10).

Use Engine 3 to move to (-5, -5), and then use Engine 2 to move to (0, -10).

The distance cannot be greater than 10, so the maximum possible distance is 10.

Sample Input 2

5
1 1
1 0
0 1
-1 0
0 -1

Sample Output 2

2.828427124746190097603377448419396157139343750753

The maximum possible final distance is 2 \sqrt{2} = 2.82842....
One of the ways to achieve it is:

Use Engine 1 to move to (1, 1), and then use Engine 2 to move to (2, 1), and finally use Engine 3 to move to (2, 2).

Sample Input 3

5
1 1
2 2
3 3
4 4
5 5

Sample Output 3

21.213203435596425732025330863145471178545078130654

If we use all the engines in the order 1 \rightarrow 2 \rightarrow 3 \rightarrow 4 \rightarrow 5, we will end up at (15, 15), with the distance 15 \sqrt{2} = 21.2132... from the origin.

Sample Input 4

3
0 0
0 1
1 0

Sample Output 4

1.414213562373095048801688724209698078569671875376

There can be useless engines with (x_i, y_i) = (0, 0).

Sample Input 5

1
90447 91000

Sample Output 5

128303.000000000000000000000000000000000000000000000000

Note that there can be only one engine.

Sample Input 6

2
96000 -72000
-72000 54000

Sample Output 6

120000.000000000000000000000000000000000000000000000000

There can be only two engines, too.

Sample Input 7

10
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20

Sample Output 7

148.660687473185055226120082139313966514489855137208

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
            // 準備
            decimal d1Rg = 57.29578M;
            List<ClsAng> lstAng = new List<ClsAng>();
            GetlstAng(lstAng);
            //DispDebug(lstAng);

            // 入力
            string[] sS = System.Console.ReadLine().Trim().Split(' ');
            int iN = int.Parse(sS[0]);
            List<ClsEng> lstEng = new List<ClsEng>();
            for (int i = 0; i < iN; i++)
            {
                sS = System.Console.ReadLine().Trim().Split(' ');
                ClsEng oneUsr = new ClsEng();
                oneUsr.iXz = decimal.Parse(sS[0]);
                oneUsr.iYz = decimal.Parse(sS[1]);
                oneUsr.iAg = (decimal)Math.Atan2((double)oneUsr.iYz, (double)oneUsr.iXz);
                oneUsr.dAg = oneUsr.iAg * d1Rg;
                lstEng.Add(oneUsr);
            }
            //DispDebg2(lstEng);

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            // 解析
            for (int i = 0; i < 360; i++)               // 1°づつ角度を変えてその範囲(視覚180°)の点のみの合計を求める
            {
                decimal iX = 0;
                decimal iY = 0;
                List<int> iNo = new List<int>();
                for (int j = 0; j < lstEng.Count; j++)
                {
                    if ((lstAng[i].iPS <= lstEng[j].iAg && lstEng[j].iAg <= lstAng[i].iPE) ||
                        (lstAng[i].iMS <= lstEng[j].iAg && lstEng[j].iAg <= lstAng[i].iME) )
                    {
                        iX += lstEng[j].iXz;
                        iY += lstEng[j].iYz;
                        iNo.Add(j + 1);
                    }
                }
                lstAng[i].iDe = (decimal)Math.Sqrt(Math.Pow((double)iX, 2D) + Math.Pow((double)iY, 2D));    // 最終的な距離
                lstAng[i].iXz = iX;                                                                         // 最終的な距離
                lstAng[i].iYz = iY;                                                                         // 最終的な距離
                lstAng[i].iNo = iNo;                                                                        // EngNo
            }
            //DispDebug(lstAng);
            lstAng.Sort(delegate (ClsAng mca1, ClsAng mca2) { return (int)(mca2.iDe * 100 - mca1.iDe * 100); });        // 降順

            // 出力
            System.Console.WriteLine("{0}", lstAng[0].iDe.ToString().Trim());
            //DispDebug(lstAng);

            sw.Stop();
#if DEBUG
            Console.WriteLine();
            Console.WriteLine("{0}", sw.Elapsed.ToString());
            Console.WriteLine("続行するには何かキーを押してください．．．");
            Console.ReadKey();
#endif
    }

        private static void DispDebg2(List<ClsEng> lstEng)
        {
            for (int i = 0; i < lstEng.Count; i++)
            {
                string sOut = "";
                sOut += lstEng[i].iXz.ToString(" 000;-000; 000") + " ";
                sOut += lstEng[i].iYz.ToString(" 000;-000; 000") + " ";
                sOut += lstEng[i].iAg.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += lstEng[i].dAg.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                System.Console.WriteLine("{0}", sOut.ToString());
            }
        }

        private static void DispDebug(List<ClsAng> lstAng)
        {
            decimal d1Rg = 57.29578M;
            for (int i = 0; i < lstAng.Count; i++)
            {
                string sOut = "";
                sOut += lstAng[i].iCa.ToString(" 000;-000; 000") + " ";
                sOut += lstAng[i].iPS.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += lstAng[i].iPE.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += lstAng[i].iMS.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += lstAng[i].iME.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += "   ";
                sOut += (lstAng[i].iPS * d1Rg).ToString(" 000;-000; 000") + " ";
                sOut += (lstAng[i].iPE * d1Rg).ToString(" 000;-000; 000") + " ";
                sOut += (lstAng[i].iMS * d1Rg).ToString(" 000;-000; 000") + " ";
                sOut += (lstAng[i].iME * d1Rg).ToString(" 000;-000; 000") + " ";
                sOut += "   ";
                sOut += lstAng[i].dPS.ToString(" 000;-000; 000") + " ";
                sOut += lstAng[i].dPE.ToString(" 000;-000; 000") + " ";
                sOut += lstAng[i].dMS.ToString(" 000;-000; 000") + " ";
                sOut += lstAng[i].dME.ToString(" 000;-000; 000") + " ";
                sOut += "   ";
                sOut += lstAng[i].iDe.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += lstAng[i].iXz.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += lstAng[i].iYz.ToString(" 000.0000;-000.0000; 000.0000") + " ";
                sOut += "   ";
                for (int j = 0; j < lstAng[i].iNo.Count; j++)
                {
                    sOut += lstAng[i].iNo[j].ToString() + " ";
                }
                    System.Console.WriteLine("{0}", sOut.ToString());
            }
        }

        private static void GetlstAng(List<ClsAng> lstAng)
        {
            decimal d1Do = (decimal)(Math.PI / 180d);
            for (int i = 0; i < 360; i++)
            {
                ClsAng oneUsr = new ClsAng();
                oneUsr.iCa = (decimal)i;
                if (000 <= i && i < 090)
                {
                    oneUsr.iMS = d1Do * (-090M + (decimal)(i + 00));            // 000～089まで
                    oneUsr.iME = d1Do * (+000M + (decimal)(0 + 00));            // たぶんこれで角度はOK
                    oneUsr.iPS = d1Do * (+000M + (decimal)(0 + 00));
                    oneUsr.iPE = d1Do * (+090M + (decimal)(i + 00));
                    oneUsr.dMS = (-090M + (decimal)(i + 00));                   // 000～089まで
                    oneUsr.dME = (+000M + (decimal)(0 + 00));                   // -180～-0 0～180で表す
                    oneUsr.dPS = (+000M + (decimal)(0 + 00));
                    oneUsr.dPE = (+090M + (decimal)(i + 00));

                }
                else if (090 <= i && i < 180)
                {
                    oneUsr.iMS = d1Do * (-180M + (decimal)(0 + 000));            // 090～179まで
                    oneUsr.iME = d1Do * (-180M + (decimal)(i - 090));
                    oneUsr.iPS = d1Do * (+000M + (decimal)(i - 090));
                    oneUsr.iPE = d1Do * (+180M + (decimal)(0 + 000));
                    oneUsr.dMS = (-180M + (decimal)(0 + 000));                   // 000～089まで
                    oneUsr.dME = (-180M + (decimal)(i - 090));                   // -180～-0 0～180で表す
                    oneUsr.dPS = (+000M + (decimal)(i - 090));
                    oneUsr.dPE = (+180M + (decimal)(0 + 000));
                }
                else if (180 <= i && i < 270)
                {
                    oneUsr.iMS = d1Do * (-180M + (decimal)(0 + 000));            // 180～269まで
                    oneUsr.iME = d1Do * (-180M + (decimal)(i - 090));
                    oneUsr.iPS = d1Do * (+000M + (decimal)(i - 090));
                    oneUsr.iPE = d1Do * (+180M + (decimal)(0 + 000));
                    oneUsr.dMS = (-180M + (decimal)(0 + 000));                   // 000～089まで
                    oneUsr.dME = (-180M + (decimal)(i - 090));                   // -180～-0 0～180で表す
                    oneUsr.dPS = (+000M + (decimal)(i - 090));
                    oneUsr.dPE = (+180M + (decimal)(0 + 000));
                }
                else if (270 <= i && i < 360)
                {
                    oneUsr.iMS = d1Do * (-180M + (decimal)(i - 270));           // 270～359まで
                    oneUsr.iME = d1Do * (+000M + (decimal)(0 - 000));
                    oneUsr.iPS = d1Do * (+000M + (decimal)(0 + 000));
                    oneUsr.iPE = d1Do * (+000M + (decimal)(i - 270));
                    oneUsr.dMS = (-180M + (decimal)(i - 270));                   // 000～089まで
                    oneUsr.dME = (+000M + (decimal)(0 - 000));                   // -180～-0 0～180で表す
                    oneUsr.dPS = (+000M + (decimal)(0 + 000));
                    oneUsr.dPE = (+000M + (decimal)(i - 270));
                }
                oneUsr.iDe = 0M;
                lstAng.Add(oneUsr);
            }
        }

        private class ClsEng
        {
            public decimal iXz { get; set; } = 0M;                  // X
            public decimal iYz { get; set; } = 0M;                  // Y
            public decimal iAg { get; set; } = 0M;                  // θ
            public decimal dAg { get; set; } = 0M;                  // θ°
        }

        private class ClsAng
        {
            public decimal iCa { get; set; } = 0M;                  // θ
            public decimal iPS { get; set; } = 0M;                  // 開始θ
            public decimal iPE { get; set; } = 0M;                  // 終了θ
            public decimal iMS { get; set; } = 0M;                  // 開始θ
            public decimal iME { get; set; } = 0M;                  // 終了θ
            public decimal iDe { get; set; } = 0M;                  // 総距離

            // コメントアウト予定
            public decimal iXz { get; set; } = 0M;                  // 最終地点X
            public decimal iYz { get; set; } = 0M;                  // 最終地点Y
            public List<int> iNo { get; set; } = new List<int>();   // EngNo
            public decimal dPS { get; set; } = 0M;                  // 開始θ°
            public decimal dPE { get; set; } = 0M;                  // 終了θ°
            public decimal dMS { get; set; } = 0M;                  // 開始θ°
            public decimal dME { get; set; } = 0M;                  // 終了θ°
        }

}