# verify-helper: PROBLEM https://yukicoder.me/problems/no/1080 when not declared ATCODER_HEADER_HPP: const ATCODER_HEADER_HPP* = 1 {.hints:off checks:off assertions:on checks:off optimization:speed.} import std/algorithm as algorithm_lib import std/sequtils as sequils_lib import std/tables as tables_lib import std/macros as macros_lib import std/math as math_lib import std/sets as sets_lib import std/strutils as strutils_lib import std/streams as streams_lib import std/strformat as strformat_lib import std/sugar as sugar_lib proc scanf*(formatstr: cstring){.header: "", varargs.} proc getchar*(): char {.header: "", varargs.} proc nextInt*(base:int = 0): int = scanf("%lld",addr result) result -= base proc nextFloat*(): float = scanf("%lf",addr result) proc nextString*(): string = var get = false;result = "" while true: var c = getchar() if int(c) > int(' '): get = true;result.add(c) elif get: break template `max=`*(x,y:typed):void = x = max(x,y) template `min=`*(x,y:typed):void = x = min(x,y) template inf*(T): untyped = when T is SomeFloat: T(Inf) elif T is SomeInteger: ((T(1) shl T(sizeof(T)*8-2)) - (T(1) shl T(sizeof(T)*4-1))) else: assert(false) # modSqrt {{{ when not declared ATCODER_MODSQRT_HPP: const ATCODER_MODSQRT_HPP* = 1 when not declared ATCODER_MODINT_HPP: const ATCODER_MODINT_HPP* = 1 type StaticModInt*[M: static[int]] = distinct uint32 DynamicModInt*[T: static[int]] = distinct uint32 type ModInt* = StaticModInt or DynamicModInt proc isStaticModInt*(T:typedesc):bool = T is StaticModInt proc isDynamicModInt*(T:typedesc):bool = T is DynamicModInt proc isModInt*(T:typedesc):bool = T.isStaticModInt or T.isDynamicModInt proc isStatic*(T:typedesc[ModInt]):bool = T is StaticModInt when not declared ATCODER_INTERNAL_MATH_HPP: const ATCODER_INTERNAL_MATH_HPP* = 1 import std/math # Fast moduler by barrett reduction # Reference: https:#en.wikipedia.org/wiki/Barrett_reduction # NOTE: reconsider after Ice Lake type Barrett* = object m*, im:uint # @param m `1 <= m` proc initBarrett*(m:uint):auto = Barrett(m:m, im:(0'u - 1'u) div m + 1) # @return m proc umod*(self: Barrett):uint = self.m {.emit: """ inline unsigned long long calc_mul(const unsigned long long &a, const unsigned long long &b){ return (unsigned long long)(((unsigned __int128)(a)*b) >> 64); } """.} proc calc_mul*(a,b:culonglong):culonglong {.importcpp: "calc_mul(#,#)", nodecl.} # @param a `0 <= a < m` # @param b `0 <= b < m` # @return `a * b % m` proc mul*(self: Barrett, a:uint, b:uint):uint = # [1] m = 1 # a = b = im = 0, so okay # [2] m >= 2 # im = ceil(2^64 / m) # -> im * m = 2^64 + r (0 <= r < m) # let z = a*b = c*m + d (0 <= c, d < m) # a*b * im = (c*m + d) * im = c*(im*m) + d*im = c*2^64 + c*r + d*im # c*r + d*im < m * m + m * im < m * m + 2^64 + m <= 2^64 + m * (m + 1) < 2^64 * 2 # ((ab * im) >> 64) == c or c + 1 let z = a * b # #ifdef _MSC_VER # unsigned long long x; # _umul128(z, im, &x); # #else ##TODO # unsigned long long x = # (unsigned long long)(((unsigned __int128)(z)*im) >> 64); # #endif let x = calc_mul(z.culonglong, self.im.culonglong).uint var v = z - x * self.m if self.m <= v: v += self.m return v # @param n `0 <= n` # @param m `1 <= m` # @return `(x ** n) % m` proc pow_mod_constexpr*(x,n,m:int):int = if m == 1: return 0 var r = 1 y = floorMod(x, m) n = n while n != 0: if (n and 1) != 0: r = (r * y) mod m y = (y * y) mod m n = n shr 1 return r.int # Reference: # M. Forisek and J. Jancina, # Fast Primality Testing for Integers That Fit into a Machine Word # @param n `0 <= n` proc is_prime_constexpr*(n:int):bool = if n <= 1: return false if n == 2 or n == 7 or n == 61: return true if n mod 2 == 0: return false var d = n - 1 while d mod 2 == 0: d = d div 2 for a in [2, 7, 61]: var t = d y = pow_mod_constexpr(a, t, n) while t != n - 1 and y != 1 and y != n - 1: y = y * y mod n t = t shl 1 if y != n - 1 and t mod 2 == 0: return false return true proc is_prime*[n:static[int]]():bool = is_prime_constexpr(n) # # # @param b `1 <= b` # # @return pair(g, x) s.t. g = gcd(a, b), xa = g (mod b), 0 <= x < b/g proc inv_gcd*(a, b:int):(int,int) = var a = floorMod(a, b) if a == 0: return (b, 0) # Contracts: # [1] s - m0 * a = 0 (mod b) # [2] t - m1 * a = 0 (mod b) # [3] s * |m1| + t * |m0| <= b var s = b t = a m0 = 0 m1 = 1 while t != 0: var u = s div t s -= t * u; m0 -= m1 * u; # |m1 * u| <= |m1| * s <= b # [3]: # (s - t * u) * |m1| + t * |m0 - m1 * u| # <= s * |m1| - t * u * |m1| + t * (|m0| + |m1| * u) # = s * |m1| + t * |m0| <= b var tmp = s s = t;t = tmp; tmp = m0;m0 = m1;m1 = tmp; # by [3]: |m0| <= b/g # by g != b: |m0| < b/g if m0 < 0: m0 += b div s return (s, m0) # Compile time primitive root # @param m must be prime # @return primitive root (and minimum in now) proc primitive_root_constexpr*(m:int):int = if m == 2: return 1 if m == 167772161: return 3 if m == 469762049: return 3 if m == 754974721: return 11 if m == 998244353: return 3 var divs:array[20, int] divs[0] = 2 var cnt = 1 var x = (m - 1) div 2 while x mod 2 == 0: x = x div 2 var i = 3 while i * i <= x: if x mod i == 0: divs[cnt] = i cnt.inc while x mod i == 0: x = x div i i += 2 if x > 1: divs[cnt] = x cnt.inc var g = 2 while true: var ok = true for i in 0.. 0: let t = a div b a -= t * b;swap(a, b) u -= t * v;swap(u, v) return T.init(u) proc val*(m: ModInt): int {.inline.} = int(m) proc `-`*[T:ModInt](m: T): T {.inline.} = if int(m) == 0: return m else: return T(m.umod() - uint32(m)) template generateDefinitions(name, l, r, body: untyped): untyped {.dirty.} = proc name*[T:ModInt](l: T; r: T): auto {.inline.} = body proc name*[T:ModInt](l: SomeInteger; r: T): auto {.inline.} = body proc name*[T:ModInt](l: T; r: SomeInteger): auto {.inline.} = body proc `+=`*[T:ModInt](m: var T; n: SomeInteger | T) {.inline.} = uint32(m) += T.init(n).uint32 if uint32(m) >= T.umod: uint32(m) -= T.umod proc `-=`*[T:ModInt](m: var T; n: SomeInteger | T) {.inline.} = uint32(m) -= T.init(n).uint32 if uint32(m) >= T.umod: uint32(m) += T.umod proc `*=`*[T:ModInt](m: var T; n: SomeInteger | T) {.inline.} = when T is StaticModInt: uint32(m) = (uint(m) * T.init(n).uint mod T.umod).uint32 elif T is DynamicModInt: uint32(m) = T.getBarrett[].mul(uint(m), T.init(n).uint).uint32 else: static: assert false proc `/=`*[T:ModInt](m: var T; n: SomeInteger | T) {.inline.} = uint32(m) = (uint(m) * T.init(n).inv().uint mod T.umod).uint32 # proc `==`*[T:ModInt](m: T; n: SomeInteger | T): bool {.inline.} = # int(m) == T.init(n).int generateDefinitions(`+`, m, n): result = T.init(m) result += n generateDefinitions(`-`, m, n): result = T.init(m) result -= n generateDefinitions(`*`, m, n): result = T.init(m) result *= n generateDefinitions(`/`, m, n): result = T.init(m) result /= n generateDefinitions(`==`, m, n): result = (T.init(m).int == T.init(n).int) proc inc*[T:ModInt](m: var T) {.inline.} = uint32(m).inc if m == T.umod: uint32(m) = 0 proc dec*[T:ModInt](m: var T) {.inline.} = if m == 0: uint32(m) = T.umod - 1 else: uint32(m).dec proc pow*[T:ModInt](m: T; p: SomeInteger): T {.inline.} = assert 0 <= p var p = p.int m = m uint32(result) = 1 while p > 0: if (p and 1) == 1: result *= m m *= m p = p shr 1 proc `^`*[T:ModInt](m: T; p: SomeInteger): T {.inline.} = m.pow(p) type modint998244353* = StaticModInt[998244353] type modint1000000007* = StaticModInt[1000000007] type modint* = DynamicModInt[-1] discard import std/options proc modSqrt*[T:ModInt](a:T):Option[T] = let p = a.umod.int if a == 0: return T(0).some if p == 2: return T(a).some if a.pow((p - 1) shr 1) != 1: return none(T) var b = T(1) while b.pow((p - 1) shr 1) == 1: b += 1 var e = 0 m = p - 1 while m mod 2 == 0: m = m shr 1; e.inc var x = a.pow((m - 1) shr 1) y = a * x * x x *= a var z = b.pow(m) while y != 1: var j = 0 t = y while t != 1: j.inc t *= t z = z.pow(1 shl (e - j - 1)) x *= z z *= z y *= z e = j return T(x).some #}}} when not declared ATCODER_NTT_HPP: const ATCODER_NTT_HPP* = 1 when not declared ATCODER_ELEMENT_CONCEPTS_HPP: const ATCODER_ELEMENT_CONCEPTS_HPP* = 1 proc inv*[T:SomeFloat](a:T):auto = T(1) / a proc init*(self:typedesc[SomeFloat], a:SomeNumber):auto = self(a) type AdditiveGroupElem* = concept x, type T x + x x - x -x T(0) type MultiplicativeGroupElem* = concept x, type T x * x x / x # x.inv() T(1) type RingElem* = concept x, type T x + x x - x -x x * x T(0) T(1) type FieldElem* = concept x, type T x + x x - x x * x x / x -x # x.inv() T(0) T(1) type FiniteFieldElem* = concept x, type T x is FieldElem T.mod() T.mod() is int x.pow(1000000) type hasInf* = concept x, type T T(Inf) discard when not declared ATCODER_PARTICULAR_MOD_CONVOLUTION: const ATCODER_PARTICULAR_MOD_CONVOLUTION* = 1 when not declared ATCODER_CONVOLUTION_HPP: const ATCODER_CONVOLUTION_HPP* = 1 import std/math import std/sequtils import std/sugar when not declared ATCODER_INTERNAL_BITOP_HPP: const ATCODER_INTERNAL_BITOP_HPP* = 1 import std/bitops #ifdef _MSC_VER #include #endif # @param n `0 <= n` # @return minimum non-negative `x` s.t. `n <= 2**x` proc ceil_pow2*(n:SomeInteger):int = var x = 0 while (1.uint shl x) < n.uint: x.inc return x # @param n `1 <= n` # @return minimum non-negative `x` s.t. `(n & (1 << x)) != 0` proc bsf*(n:SomeInteger):int = return countTrailingZeroBits(n) discard # template * = nullptr> proc butterfly*[mint:FiniteFieldElem](a:var seq[mint]) = const g = primitive_root[mint.mod]() let n = a.len h = ceil_pow2(n) var first {.global.} = true sum_e {.global.} :array[30, mint] # sum_e[i] = ies[0] * ... * ies[i - 1] * es[i] if first: first = false var es, ies:array[30, mint] # es[i]^(2^(2+i)) == 1 let cnt2 = bsf(mint.mod - 1) mixin inv var e = mint(g).pow((mint.mod - 1) shr cnt2) ie = e.inv() for i in countdown(cnt2, 2): # e^(2^i) == 1 es[i - 2] = e ies[i - 2] = ie e *= e ie *= ie var now = mint(1) for i in 0..cnt2 - 2: sum_e[i] = es[i] * now now *= ies[i] for ph in 1..h: let w = 1 shl (ph - 1) p = 1 shl (h - ph) var now = mint(1) for s in 0..* = nullptr> proc convolution*[mint:FiniteFieldElem](a, b:seq[mint]):seq[mint] = var n = a.len m = b.len mixin inv if n == 0 or m == 0: return newSeq[mint]() var (a, b) = (a, b) if min(n, m) <= 60: if n < m: swap(n, m) swap(a, b) var ans = newSeq[mint](n + m - 1) for i in 0..::value>* = nullptr> proc convolution*[T:SomeInteger](a, b:seq[T], M:static[uint] = 998244353):seq[T] = let (n, m) = (a.len, b.len) if n == 0 or m == 0: return newSeq[T]() type mint = StaticModInt[M.int] static: assert mint is FiniteFieldElem return convolution( a.map((x:T) => mint.init(x)), b.map((x:T) => mint.init(x)) ).map((x:mint) => T(x.val())) proc convolution_ll*(a, b:seq[int]):seq[int] = let (n, m) = (a.len, b.len) if n == 0 or m == 0: return newSeq[int]() const MOD1:uint = 754974721 # 2^24 MOD2:uint = 167772161 # 2^25 MOD3:uint = 469762049 # 2^26 M2M3 = MOD2 * MOD3 M1M3 = MOD1 * MOD3 M1M2 = MOD1 * MOD2 M1M2M3 = MOD1 * MOD2 * MOD3 i1 = inv_gcd((MOD2 * MOD3).int, MOD1.int)[1].uint i2 = inv_gcd((MOD1 * MOD3).int, MOD2.int)[1].uint i3 = inv_gcd((MOD1 * MOD2).int, MOD3.int)[1].uint let c1 = convolution(a, b, MOD1) c2 = convolution(a, b, MOD2) c3 = convolution(a, b, MOD3) var c = newSeq[int](n + m - 1) for i in 0..= 20: ParticularModConvolution else: ArbitraryModConvolution proc fft*[T:FiniteFieldElem](a:seq[T]):auto = fft(get_fft_type(T), a) proc ifft*(a:auto, T:typedesc[FiniteFieldElem]):auto = ifft[T](get_fft_type(T), a) proc dot*(a, b:auto, T:typedesc[FiniteFieldElem]):auto = dot(get_fft_type(T), a, b) proc inplace_partial_dot*(a:var auto, b:auto, p:Slice[int], T:typedesc[FiniteFieldElem]) = inplace_partial_dot(get_fft_type(T), a, b, p) proc multiply*[T:FiniteFieldElem](a, b:seq[T]):seq[T] = convolution(get_fft_type(T), a, b) # FormalPowerSeries {{{ when not declared ATCODER_FORMAL_POWER_SERIES: const ATCODER_FORMAL_POWER_SERIES* = 1 import std/sequtils import std/strformat import std/options import std/macros import std/tables import std/algorithm type FormalPowerSeries*[T:FieldElem] = seq[T] template initFormalPowerSeries*[T:FieldElem](n:int):FormalPowerSeries[T] = FormalPowerSeries[T](newSeq[T](n)) template initFormalPowerSeries*[T:FieldElem](data:seq or array):FormalPowerSeries[T] = when data is FormalPowerSeries[T]: data else: var result = newSeq[T](data.len) for i, it in data: result[i] = T.init(it) result template init*[T:FieldElem](self:typedesc[FormalPowerSeries[T]], data:typed):auto = initFormalPowerSeries[T](data) macro revise(a, b) = parseStmt(fmt"""let {a.repr} = if {a.repr} == -1: {b.repr} else: {a.repr}""") proc shrink*[T](self: var FormalPowerSeries[T]) = while self.len > 0 and self[^1] == 0: discard self.pop() # operators +=, -=, *=, mod=, -, /= {{{ proc `+=`*(self: var FormalPowerSeries, r:FormalPowerSeries) = if r.len > self.len: self.setlen(r.len) for i in 0.. self.len: self.setlen(r.len) for i in 0..= 1: result.delete(0, sz - 1) proc `shl`*[T](self: FormalPowerSeries[T], sz:int):auto = result = initFormalPowerSeries[T](sz) result = result & self proc diff*[T](self: FormalPowerSeries[T]):auto = let n = self.len result = initFormalPowerSeries[T](max(0, n - 1)) for i in 1.. deg: return initFormalPowerSeries[T](deg) result = (result shl (i * k)).pre(deg) if result.len < deg: result.setlen(deg) return return self proc eval*[T](self: FormalPowerSeries[T], x:T):T = var (r, w) = (T(0), T(1)) for v in self: r += w * v w *= x return r proc powMod*[T](self: FormalPowerSeries[T], n:int, M:FormalPowerSeries[T]):auto = assert M[^1] != T(0) let modinv = M.rev().inv() proc getDiv(base:FormalPowerSeries[T]):FormalPowerSeries[T] = var base = base if base.len < M.len: base.setlen(0) return base let n = base.len - M.len + 1 return (base.rev().pre(n) * modinv.pre(n)).pre(n).rev(n) var n = n x = self result = initFormalPowerSeries[T](M.len - 1) result[0] = T(1) while n > 0: if (n and 1) > 0: result *= x result -= getDiv(result) * M result = result.pre(M.len - 1) x *= x x -= getDiv(x) * M x = x.pre(M.len - 1) n = n shr 1 # }}} import std/options type mint = StaticModInt[1000000009] let N = nextInt() let im = modSqrt(mint.init(-1)).get() var f = mint(1) P = initFormalPowerSeries[mint](N + 1) for i in 1..N: f *= mint(i) P[i] = mint(i + 1).pow(2) let e1 = exp(P * im) e2 = exp(P * (-im)) sinP = (e1 - e2) / (im * 2) cosP = (e1 + e2) / mint(2) ans = (sinP + cosP) * f for i,a in ans: if i > 0: echo a