let e30 = bigint 1e30 let e16 = bigint 1e16 let abc = stdin.ReadLine().Split(' ') |> Array.map int let conv (x:bigint)= let y = string <| abs x / e30 let z = string <| (abs x % e30) + e30 let s = if x < bigint 0 then "-" else "" s + y + "." + (z.Substring(1)) let pr (xs:bigint list) = printfn "%d" (List.length xs) List.sort xs |> List.map conv |> List.iter (printfn "%s") let sq (x:bigint) = let rec f e y z = if abs (x * e30 - e * e) < e16 * e30 then e elif e * e < x * e30 then f ((e+z)/bigint 2) e z else f ((y+e)/bigint 2) y e f (x/bigint 2) (bigint 0) x match abc with | [|0;0;0|] -> printfn "-1" | [|0;0;_|] -> printfn "0" | [|0;b;c|] -> pr [-bigint c * e30 / bigint b] | [|a;0;0|] -> printfn "0" | [|a;0;c|] when -bigint c * bigint a < bigint 0 -> printfn "0" | [|a;0;c|] -> let e = -bigint c * e30 / bigint a in let ee = sq e in pr [-ee; ee] | [|a;b;0|] -> pr [bigint 0; -bigint b * e30 /bigint a] | [|a;b;c|] -> let d = bigint b * bigint b - bigint 4 * bigint a * bigint c if d < bigint 0 then printfn "0" elif d = bigint 0 then pr [- bigint b * e30 / (bigint 2 * bigint a)] else let y = (-bigint b * e30 + sq (d *e30)) / (bigint 2 * bigint a) let z = (-bigint b * e30 - sq (d * e30)) / (bigint 2 * bigint a) pr [y;z] | _ -> ()