struct Scanner { private var elements = [String]() private var index = 0 mutating func peek() -> String { while elements.count == index { elements = readLine()!.split(separator: " ").map(String.init) index = 0 } return elements[index] } mutating func next() -> String { let value = peek() index += 1 return value } mutating func nextInt() -> Int { return Int(next())! } mutating func nextDouble() -> Double { return Double(next())! } } let MOD = 998244353 struct Zn: CustomStringConvertible { let n: Int init(_ n: Int) { self.n = n } var description: String { String(self.n) } static var zero = Zn(0) static var one = Zn(1) static func + (lhs: Self, rhs: Self) -> Self { let n = lhs.n + rhs.n return Zn(n < MOD ? n : n - MOD) } static func + (lhs: Self, rhs: Int) -> Self { return lhs + Zn(rhs) } static func + (lhs: Int, rhs: Self) -> Self { return Zn(lhs) + rhs } static func - (lhs: Self, rhs: Self) -> Self { let n = lhs.n - rhs.n return Zn(n >= 0 ? n : n + MOD) } static func - (lhs: Self, rhs: Int) -> Self { return lhs - Zn(rhs) } static func - (lhs: Int, rhs: Self) -> Self { return Zn(lhs) - rhs } static func * (lhs: Self, rhs: Self) -> Self { Zn((lhs.n * rhs.n) % MOD) } static func * (lhs: Self, rhs: Int) -> Self { return lhs * Zn(rhs) } static func * (lhs: Int, rhs: Self) -> Self { return Zn(lhs) * rhs } static func += (lhs: inout Self, rhs: Self) { lhs = lhs + rhs } static func += (lhs: inout Self, rhs: Int) { lhs = lhs + Zn(rhs) } static func -= (lhs: inout Self, rhs: Self) { lhs = lhs - rhs } static func -= (lhs: inout Self, rhs: Int) { lhs = lhs - Zn(rhs) } static func *= (lhs: inout Self, rhs: Self) { lhs = lhs * rhs } static func *= (lhs: inout Self, rhs: Int) { lhs = lhs * Zn(rhs) } func pow(_ n: Int) -> Self { if n == 0 { return Zn(1) } else if n % 2 == 1 { return self * self.pow(n - 1) } else { return (self * self).pow(n / 2) } } var inverse: Self { self.pow(MOD - 2) } } struct Array2D { let n1: Int let n2: Int private var elements: [Element] init(repeating: Element, _ n1: Int, _ n2: Int) { self.n1 = n1 self.n2 = n2 self.elements = [Element](repeating: repeating, count: n1 * n2) } subscript(i: Int, j: Int) -> Element { get { elements[i * n2 + j] } set { elements[i * n2 + j] = newValue } } } var scanner = Scanner() let N = scanner.nextInt() let A = (0 ..< N).map { _ in scanner.nextInt() } func f(_ a: [Int], bounded: Bool) -> [Zn] { var xor = 0 var prob = Zn.one if !bounded || a.count > 0 { prob *= Zn(2).inverse } var result = [prob, .zero] for i in a.indices { if a[i] == -1 { xor ^= 1 } if !bounded || i < a.count - 1 { prob *= Zn(2).inverse } result[xor] += prob } return result } var answer = Zn.zero for i in 0 ..< N where abs(A[i]) == 2 { var l = i var r = i + 1 while l - 1 >= 0 && abs(A[l - 1]) == 1 { l -= 1 } while r + 1 <= N && abs(A[r]) == 1 { r += 1 } let L = f([Int](A[l ..< i].reversed()), bounded: l == 0) let R = f([Int](A[i + 1 ..< r]), bounded: r == N) if A[i] == 2 { answer += L[0] * R[1] + L[1] * R[0] } else { answer += L[0] * R[0] + L[1] * R[1] } print(l, r) } print(answer)