← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD = 998244353

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func modInverse(n int64) int64 {
	return power(n, MOD-2)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 2000000), 2000000)
	if !scanner.Scan() {
		return
	}
	s := scanner.Text()
	n := len(s)

	maxSize := n + 5
	fact := make([]int64, maxSize)
	invFact := make([]int64, maxSize)
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i < maxSize; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[maxSize-1] = modInverse(fact[maxSize-1])
	for i := maxSize - 2; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}

	nCr := func(n, r int) int64 {
		if r < 0 || r > n {
			return 0
		}
		num := fact[n]
		den := (invFact[r] * invFact[n-r]) % MOD
		return (num * den) % MOD
	}

	totalB, totalY := 0, 0
	for i := 0; i < n; i++ {
		if s[i] == ')' {
			totalB++
		} else if s[i] == '?' {
			totalY++
		}
	}

	ans := int64(0)
	A, X, B, Y := 0, 0, totalB, totalY

	for i := 0; i <= n; i++ {
		Q := X + Y
		K := Y - A + B
		
		term1 := (int64(A) * nCr(Q, K)) % MOD
		term2 := (int64(X) * nCr(Q-1, K-1)) % MOD
		
		ans = (ans + term1 + term2) % MOD

		if i < n {
			if s[i] == '(' {
				A++
			} else if s[i] == ')' {
				B--
			} else {
				X++
				Y--
			}
		}
	}

	fmt.Println(ans)
}