結果
問題 | No.1855 Intersected Lines |
ユーザー | Mitarushi |
提出日時 | 2022-02-24 23:27:55 |
言語 | Nim (2.0.2) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,015 bytes |
コンパイル時間 | 1,293 ms |
コンパイル使用メモリ | 75,136 KB |
最終ジャッジ日時 | 2024-11-15 15:15:18 |
合計ジャッジ時間 | 3,320 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
/home/judge/data/code/Main.nim(4, 30) Error: type mismatch: got 'seq[int]' for 'map(split(readLine(stdin), {' ', '\t', '\v', '\r', '\n', '\f'}, -1), parseInt)' but expected 'tuple'
ソースコード
import strutils, sequtils, sugar, times var n, x: int64 (n, x) = stdin.readLine.split.map(parseInt) assert 1 <= n and n <= 499122176 assert 1 <= x and x <= 400000 const MOD = 998244353i64 var cv = newSeq[(char, int64)](x) for i in 0..<x: var temp: seq[string] = stdin.readLine.split cv[i] = (temp[0][0], parseBiggestInt(temp[1])) assert cv[i][0] == 'R' or cv[i][0] == 'B' assert 1 <= cv[i][1] and cv[i][1] <= 2 * n var b_sum = cv.mapIt( if it[0] == 'B': it[1] else: 0 ).foldl(a + b) r_sum = cv.mapIt( if it[0] == 'R': it[1] else: 0 ).foldl(a + b) assert b_sum + r_sum == 2 * n assert b_sum mod 2 == 0 and r_sum mod 2 == 0 proc cross(): int64 = var sum_1 = 0i64 sum_2 = 0i64 sum_3 = 0i64 b = 0i64 ans = 0i64 for (c, v) in cv: if c == 'B': b += v else: ans += sum_1 * (b_sum * b mod MOD - b * b mod MOD) mod MOD * v ans += sum_2 * (-b_sum + 2 * b) mod MOD * v ans -= sum_3 * v ans = ans mod MOD sum_1 += v sum_1 = sum_1 mod MOD sum_2 += v * b sum_2 = sum_2 mod MOD sum_3 += v * b mod MOD * b sum_3 = sum_3 mod MOD ans proc inv(a: int64): int64 = var x = 1i64 z = a while abs(z) > 1: let q = (MOD + (abs(z) shr 1)) div z z = MOD - q * z x = -x * q mod MOD if z < 0: x = -x if x < 0: x = x + MOD x var ans = 0i64 if r_sum > 0: let n = r_sum div 2 ans += n * (n - 1) mod MOD * inv(6) if b_sum > 0: let n = b_sum div 2 ans += n * (n - 1) mod MOD * inv(6) if r_sum > 0 and b_sum > 0: ans += cross() * inv((r_sum - 1) * (b_sum - 1) mod MOD) ans = ans mod MOD if ans < 0: ans += MOD proc last_check() = try: let x = stdin.readLine assert x == "" except EOFError: return echo ans last_check()