From fd885db5acbf15d1e17fab5c0b151d3283e12709 Mon Sep 17 00:00:00 2001 From: Toshihiro Shimizu Date: Sun, 8 Dec 2024 16:40:48 +0900 Subject: [PATCH] change --- src/atcoder/extra/math/combination_table.nim | 4 +++- src/atcoder/extra/math/modint_montgomery.nim | 5 ++++- src/atcoder/extra/tree/rerooting.nim | 2 +- src/atcoder/lazysegtree.nim | 2 +- src/atcoder/modint.nim | 4 +++- src/atcoder/modint_backup.nim | 5 ++++- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/atcoder/extra/math/combination_table.nim b/src/atcoder/extra/math/combination_table.nim index d9821458..4c24d285 100644 --- a/src/atcoder/extra/math/combination_table.nim +++ b/src/atcoder/extra/math/combination_table.nim @@ -10,7 +10,9 @@ when not defined ATCODER_COMBINATION_HPP: x is typedesc[RingElem] or x is var Combination proc getAddr(T:typedesc[RingElem]):auto {.discardable.} = - var cmb_a{.global.} = Combination[T]() + var cmb_a{.global.}:Combination[T] + once: + cmb_a = Combination[T]() return cmb_a.addr template zero*(T:typedesc[RingElem]):T = T(0) diff --git a/src/atcoder/extra/math/modint_montgomery.nim b/src/atcoder/extra/math/modint_montgomery.nim index 9ff3295c..faf53a76 100644 --- a/src/atcoder/extra/math/modint_montgomery.nim +++ b/src/atcoder/extra/math/modint_montgomery.nim @@ -24,7 +24,10 @@ when not declared ATCODER_MONTGOMERY_MODINT_HPP: (M, get_r(M), get_n2(M)) proc getParameters*[T:static[int]](t:typedesc[DynamicLazyMontgomeryModInt[T]]):ptr[tuple[M, r, n2:uint32]] = - var p {.global.} : tuple[M, r, n2:uint32] = getMontgomeryParameters(998244353.uint32) + {.cast(noSideEffect).}: + var p {.global.} : tuple[M, r, n2:uint32] + once: + p = getMontgomeryParameters(998244353.uint32) return p.addr proc checkParameters(M, r:uint32) = diff --git a/src/atcoder/extra/tree/rerooting.nim b/src/atcoder/extra/tree/rerooting.nim index 03fb4534..ba780247 100644 --- a/src/atcoder/extra/tree/rerooting.nim +++ b/src/atcoder/extra/tree/rerooting.nim @@ -61,7 +61,7 @@ when not declared ATCODER_REROOTING_HPP: if self.G[v][i].dst == p: self.dp[v][i] = from_par break - var pR = newSeq[T, Weight](self.G[v].len + 1) + var pR = newSeq[T](self.G[v].len + 1) pR[self.G[v].len] = self.mi for i in countdown(self.G[v].len, 1): let e = self.G[v][i - 1] diff --git a/src/atcoder/lazysegtree.nim b/src/atcoder/lazysegtree.nim index 72ed629c..62ed67e4 100644 --- a/src/atcoder/lazysegtree.nim +++ b/src/atcoder/lazysegtree.nim @@ -64,7 +64,7 @@ when not declared ATCODER_LAZYSEGTREE_HPP: proc init*[ST:LazySegTree](self: var ST, n:int) = self.init(newSeqWith(n, ST.calc_e())) proc init*[ST:LazySegTree](self: typedesc[ST], v:seq[ST.S] or int):ST = result.init(v) - template LazySegTreeType[S, F](op0, e0, mapping0, composition0, id0:untyped):typedesc[LazySegTree] = + template LazySegTreeType*[S, F](op0, e0, mapping0, composition0, id0:untyped):typedesc[LazySegTree] = proc op1(a, b:S):S {.gensym inline.} = op0(a, b) proc e1():S {.gensym inline.} = e0() proc mapping1(f:F, s:S):S {.gensym inline.} = mapping0(f, s) diff --git a/src/atcoder/modint.nim b/src/atcoder/modint.nim index a3b793e9..53fb7956 100644 --- a/src/atcoder/modint.nim +++ b/src/atcoder/modint.nim @@ -24,7 +24,9 @@ when not declared ATCODER_MODINT_HPP: proc getBarrett*[T:static[int]](t:typedesc[DynamicModInt[T]]):ptr Barrett = {.cast(noSideEffect).}: - var Barrett_of_DynamicModInt {.global.} = initBarrett(998244353.uint) + var Barrett_of_DynamicModInt {.global.}: Barrett + once: + Barrett_of_DynamicModInt = initBarrett(998244353.uint) return Barrett_of_DynamicModInt.addr proc getMod*[T:static[int]](t:typedesc[DynamicModInt[T]]):uint32 {.inline.} = diff --git a/src/atcoder/modint_backup.nim b/src/atcoder/modint_backup.nim index b38a8e46..4301b4b9 100644 --- a/src/atcoder/modint_backup.nim +++ b/src/atcoder/modint_backup.nim @@ -15,7 +15,10 @@ when not declared ATCODER_MODINT_HPP: import atcoder/internal_math proc getBarrett*[T:static[int]](t:typedesc[DynamicModInt[T]], set = false, M:SomeInteger = 0.uint32):ptr Barrett = - var Barrett_of_DynamicModInt {.global.} = initBarrett(998244353.uint) + {.cast(noSideEffect).}: + var Barrett_of_DynamicModInt {.global.}: Barrett + once: + Barrett_of_DynamicModInt = initBarrett(998244353.uint) return Barrett_of_DynamicModInt.addr proc getMod*[T:static[int]](t:typedesc[DynamicModInt[T]]):uint32 {.inline.} = (t.getBarrett)[].m.uint32