#nullable enable using System.Numerics; #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static double V(Complex p1, Complex p2, double scale, Complex rotation, double sx, double sy) { p1 = p1 * scale * rotation; p2 = p2 * scale * rotation; var x1 = p1.Real + sx; var y1 = p1.Imaginary + sy; var x2 = p2.Real + sx; var y2 = p2.Imaginary + sy; var m = (y2 - y1) / (x2 - x1); var c = y1 - x1 * m; var s = Math.Max(1, Math.Max(Math.Abs(m), Math.Abs(c))); return Math.Abs(m + c + 1) / s; } static double F((double, double, double) c1, (double, double, double) c2) { if (c1.Item3 > c2.Item3) (c1, c2) = (c2, c1); var (x1, y1, r1) = c1; var (x2, y2, r2) = c2; x2 -= x1; y2 -= y1; var arg2 = new Complex(x2, y2); arg2 /= arg2.Magnitude; var center2 = new Complex(x2, y2) / arg2; (x2, y2) = (center2.Real, center2.Imaginary); x2 /= r1; y2 /= r1; r2 /= r1; var h = Math.PI / 2; var argI = new Complex(-arg2.Real, arg2.Imaginary); var res = 0.0; { var p1 = new Complex(); var p2 = p1; var pass = 0.0; var fail = h; while (Math.Abs(pass - fail) > 0.00000001) { var mid = (pass + fail) / 2; p1 = new Complex(Math.Cos(mid), Math.Sin(mid)); p2 = new Complex(x2, y2) - p1 * r2; var v = p1 - p2; var r = (v / p1).Phase; if (r > h) pass = mid; else fail = mid; } res += V(p1, p2, r1, arg2, x1, y1); res += V(p1, p2, r1, argI, x1, y1); } { var p3 = new Complex(); var p4 = p3; var pass = h; var fail = Math.PI; while (Math.Abs(pass - fail) > 0.00000001) { var mid = (pass + fail) / 2; p3 = new Complex(Math.Cos(mid), Math.Sin(mid)); p4 = new Complex(x2, y2) + p3 * r2; var v = p3 - p4; var r = (v / p3).Phase; if (r > h) pass = mid; else fail = mid; } res += V(p3, p4, r1, arg2, x1, y1); res += V(p3, p4, r1, argI, x1, y1); } return res; } var t = I(); var ans = new List(); for (var i = 0; i < t; i++) { var x1 = I(); var y1 = I(); var r1 = I(); var x2 = I(); var y2 = I(); var r2 = I(); var z = F((x1, y1, r1), (x2, y2, r2)); ans.Add(z.ToString("F9")); } Console.WriteLine(string.Join(Environment.NewLine, ans));