結果
| 問題 |
No.117 組み合わせの数
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-16 22:33:31 |
| 言語 | Nim (2.2.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 3,123 bytes |
| コンパイル時間 | 796 ms |
| コンパイル使用メモリ | 64,624 KB |
| 最終ジャッジ日時 | 2024-11-14 20:43:40 |
| 合計ジャッジ時間 | 1,154 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
/home/judge/data/code/Main.nim(14, 30) Warning: inherit from a more precise exception type like ValueError, IOError or OSError. If these don't suit, inherit from CatchableError or Defect. [InheritFromException] stack trace: (most recent call last) Main.nim(8, 9) unpack /home/judge/data/code/Main.nim(91, 12) template/generic instantiation of `input` from here /home/judge/data/code/Main.nim(23, 43) template/generic instantiation of `unpack` from here /home/judge/data/code/Main.nim(8, 9) Error: index out of bounds, the container is empty
ソースコード
from sequtils import map, mapIt
from strutils import split, parseInt, parseFloat
import macros
macro unpack*(input: seq; count: static[int]): untyped =
result = quote do: ()
when NimMinor <= 13:
for i in 0..<count: result[0].add quote do: `input`[`i`]
else:
for i in 0..<count: result.add quote do: `input`[`i`]
## count == 0 のとき unpackしない(seq)
## count > 0 のとき count個分 unpack した結果の tuple を返す
type UnselectableTypeError = object of Exception
template input*(typ: typedesc; count: Natural = 0): untyped =
let line = stdin.readLine.split
when count == 0:
when typ is int: line.map(parseInt)
elif typ is float: line.map(parseFloat)
elif typ is string: line
else: raise newException(UnselectableTypeError, "You selected a type other than int, float or string")
else:
when typ is int: line.map(parseInt).unpack(count)
elif typ is float: line.map(parseFloat).unpack(count)
elif typ is string: line.unpack(count)
else: raise newException(UnselectableTypeError, "You selected a type other than int, float or string")
template inputs*(typ: typedesc; count = 0; rows = 1): untyped =
(1..rows).mapIt(input(typ, count))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
template secretEcho*(x: varargs[string, `$`]) =
for v in x:
stderr.write(v)
echo ""
template secretEcho*[T](x: seq[seq[T]]) =
for v in x: secretEcho v
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
type ModComb* = ref object of RootObj
modFacs: seq[int]
modFacInvs: seq[int]
MOD: int
proc modPow(n, p, m: int): int =
if p == 0:
1
elif p mod 2 == 0:
let half = modPow(n, p div 2, m)
half * half mod m
else:
n * modPow(n, p - 1, m) mod m
proc newModComb*(MOD = 1_000_000_007; size = 10_000_000): ModComb =
result = ModComb(modFacs: newSeq[int](size + 1), modFacInvs: newSeq[int](size + 1), MOD: MOD)
result.modFacs[0] = 1
result.modFacInvs[0] = 1
for i in 1..size:
result.modFacs[i] = result.modFacs[i - 1] * i mod MOD
result.modFacInvs[size] = modPow(result.modFacs[size], MOD - 2, MOD)
for i in countdown(size - 1, 0):
result.modFacInvs[i] = result.modFacInvs[i + 1] * (i + 1) mod MOD
proc C*(this: ModComb; n, r: int): int =
if r < 0 or n < r:
0
else:
this.modFacs[n] * (this.modFacInvs[r] * this.modFacInvs[n - r] mod this.MOD) mod this.MOD
proc P*(this: ModComb; n, r: int): int =
if r < 0 or n < r:
0
else:
this.modFacs[n] * this.modFacInvs[n - r] mod this.MOD
proc H*(this: ModComb; n, r: int): int =
if r == 0:
1
elif n == 0:
0
else:
this.C(n + r - 1, r)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
from strutils import join
let
T = input(int, 1)
S = inputs(string, 1, T).map(proc (s: string): seq[string] = s.split({'(', ')', ','}))
comb = newModComb()
for s in S:
let
n = s[1].parseInt
r = s[2].parseInt
case s[0]:
of "C":
echo comb.C(n, r)
of "P":
echo comb.P(n, r)
of "H":
echo comb.H(n, r)
else:
discard