結果
問題 | No.955 ax^2+bx+c=0 |
ユーザー | しぶつまひ |
提出日時 | 2019-12-18 08:01:33 |
言語 | F# (F# 4.0) |
結果 |
AC
|
実行時間 | 377 ms / 2,000 ms |
コード長 | 1,388 bytes |
コンパイル時間 | 14,437 ms |
コンパイル使用メモリ | 191,248 KB |
実行使用メモリ | 37,664 KB |
最終ジャッジ日時 | 2024-09-18 22:09:50 |
合計ジャッジ時間 | 56,407 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 122 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.fsproj を復元しました (291 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
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|] -> pr [bigint 0] | [|a;0;c|] when -bigint c * e30 / 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] | _ -> ()