結果
問題 | No.251 大きな桁の復習問題(1) |
ユーザー |
|
提出日時 | 2019-01-27 19:50:17 |
言語 | Nim (2.2.0) |
結果 |
AC
|
実行時間 | 4 ms / 5,000 ms |
コード長 | 2,433 bytes |
コンパイル時間 | 2,324 ms |
コンパイル使用メモリ | 61,088 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-01 11:03:11 |
合計ジャッジ時間 | 3,142 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
コンパイルメッセージ
/home/judge/data/code/Main.nim(1, 8) Warning: imported and not used: 'sequtils' [UnusedImport]
ソースコード
import sequtils,mathproc getchar_unlocked():char {. importc:"getchar_unlocked",header: "<stdio.h>" .}type ModInt = objectv:int # 0~MODに収まるconst MOD = 129402307template useModulo() =proc toModInt*(a:int) : ModInt =if a < -MOD : result.v = ((a mod MOD) + MOD) mod MODelif a < 0 : result.v = a + MODelif a >= MOD: result.v = a mod MODelse: result.v = aproc `+`*(a,b:ModInt) : ModInt =result.v = a.v + b.vif result.v >= MOD : result.v = result.v mod MODproc `*`*(a,b:ModInt) : ModInt =result.v = a.v * b.vif result.v >= MOD : result.v = result.v mod MODproc `^`*(a:ModInt,b:int) : ModInt =if a.v == 0 : return 0.toModInt()if b == 0 : return 1.toModInt()if b == 1 : return alet pow = a^(b div 2)if b mod 2 == 0 : return pow * powreturn pow * pow * aproc `+`*(a:int,b:ModInt) : ModInt = a.toModInt() + bproc `+`*(a:ModInt,b:int) : ModInt = a + b.toModInt()proc `-`*(a:ModInt,b:int) : ModInt = a + (-b)proc `-`*(a,b:ModInt) : ModInt = a + (-b.v)proc `-`*(a:int,b:ModInt) : ModInt = a.toModInt() + (-b.v)proc `*`*(a:int,b:ModInt) : ModInt = a.toModInt() * bproc `*`*(a:ModInt,b:int) : ModInt = a * b.toModInt()proc `/`*(a,b:ModInt) : ModInt = a * b^(MOD-2)proc `$`*(a:ModInt) : string = $a.vuseModulo()proc scan(isTrulyZero:var bool): ModInt =result = 0.toModInt()block:let k = getchar_unlocked()result = 10 * result + k.ord - '0'.ordisTrulyZero = k == '0'block:let k = getchar_unlocked()if k < '0': returnisTrulyZero = falseresult = 10 * result + k.ord - '0'.ordwhile true:let k = getchar_unlocked()if k < '0': returnresult = 10 * result + k.ord - '0'.ordproc scanX(isTrulyZero:var bool): int =const nowMOD = MOD - 1result = 0block:let k = getchar_unlocked()result = 10 * result + k.ord - '0'.ordisTrulyZero = k == '0'block:let k = getchar_unlocked()if k < '0': returnisTrulyZero = falseresult = 10 * result + k.ord - '0'.ordwhile true:let k = getchar_unlocked()if k < '0': breakresult = 10 * result + k.ord - '0'.ordif result >= nowMOD : result = result mod nowMODvar isTrulyZero = falselet n = scan(isTrulyZero)var isTrulyZeroX = falselet m = scanX(isTrulyZeroX)if n.v == 0 : # 0^m == 0 | x^0if not isTrulyZero and isTrulyZeroX : echo 1else: echo 0else:echo n^m