using System; using System.Collections.Generic; using System.Linq; class Program { static string InputPattern = "InputX"; static List GetInputList() { var WillReturn = new List(); if (InputPattern == "Input1") { WillReturn.Add("3"); WillReturn.Add("1 0 4 1"); WillReturn.Add("2 4 15 4"); WillReturn.Add("0 0 1000000000000000000 1000000000000000000"); //3 //0 //1000000000000000000 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } static decimal[] GetSplitArr(string pStr) { return (pStr == "" ? new string[0] : pStr.Split(' ')).Select(pX => decimal.Parse(pX)).ToArray(); } static void Main() { List InputList = GetInputList(); decimal[] wkArr = { }; Action SplitAct = (pStr) => wkArr = GetSplitArr(pStr); foreach (string EachStr in InputList.Skip(1)) { SplitAct(EachStr); decimal SX = wkArr[0]; decimal SY = wkArr[1]; decimal TX = wkArr[2]; decimal TY = wkArr[3]; decimal Answer = Solve(SX, SY, TX, TY); Console.WriteLine(Answer); } } static decimal Solve(decimal pSX, decimal pSY, decimal pTX, decimal pTY) { decimal Answer = 0; // Y座標の移動コスト Answer += Math.Abs(pSY - pTY); decimal AnswerY = Math.Max(pSY, pTY); decimal Beki2 = 1; for (long I = 1; I <= AnswerY; I++) { if (WillOverProd(Beki2, 2, pSX) && WillOverProd(Beki2, 2, pTX)) { Beki2 = decimal.MaxValue; break; } else { Beki2 *= 2; } } decimal Div1 = Math.Truncate(pSX / Beki2); decimal Div2 = Math.Truncate(pTX / Beki2); Answer += Math.Abs(Div1 - Div2); return Answer; } // decimal型の2正数の掛け算が、Limitを超えるかを返す static bool WillOverProd(decimal pA, decimal pB, decimal pLimit) { decimal Mod = pLimit % pB; pLimit -= Mod; return pA > pLimit / pB; } }