← Home
```go
package main

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

const MOD = 998244353

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

	minPref := 0
	curr := 0
	for i := 0; i < n; i++ {
		if s[i] == '(' {
			curr++
		} else {
			curr--
		}
		if curr < minPref {
			minPref = curr
		}
	}

	M := -minPref
	if M == 0 && curr == 0 {
		fmt.Println(1)
		return
	}

	firstMin := -1
	lastMin := -1
	curr = 0
	for i := 0; i < n; i++ {
		if s[i] == '(' {
			curr++
		} else {
			curr--
		}
		if curr == minPref {
			if firstMin == -1 {
				firstMin = i
			}
			lastMin = i
		}
	}

	ans1 := calc(s[:firstMin+1], M, ')')
	ans2 := calc(reverseSwap(s[lastMin:]), curr-minPref, ')')

	ans := (ans1 * ans2) % MOD
	fmt.Println(ans)
}

func reverseSwap(s string) string {
	b := []byte(s)
	for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
		b[i], b[j] = b[j], b[i]
	}
	for i := 0; i < len(b); i++ {
		if b[i] == '(' {
			b[i] = ')'
		} else {
			b[i] = '('
		}
	}
	return string(b)
}

func calc(s string, M int, dropChar byte) int64 {
	if M == 0 {
		return 1
	}
	
	dp := make([]int, M+1)
	dp[0] = 1

	pref := 0
	for i := 0; i < len(s); i++ {
		if s[i] != dropChar {
			pref++
		} else {
			pref--
			limit := -pref
			if limit < 0 {
				limit = 0
			}
			for k := limit; k <= M; k++ {
				if k > 0 {
					dp[k] = (dp[k] + dp[k-1])
					if dp[k] >= MOD {
						dp[k] -= MOD
					}
				}
			}
			if limit > 0 {
				dp[limit-1] = 0
			}
		}
	}
	return int64(dp[M])
}

func main() {
	solve()
}
```