#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T read() {
  T f = 0, x = 0;
  char c = getchar();
  while (!isdigit(c)) f = c == '-', c = getchar();
  while (isdigit(c)) x = x * 10 + c - 48, c = getchar();
  return f ? -x : x;
}
namespace run {
const int N = 1e6 + 9, mod = 998244353;
inline int add(int x, int y) { return x + y >= mod ? x - mod + y : x + y; }
inline int sub(int x, int y) { return x >= y ? x - y : x + mod - y; }
inline int qpow(int x, int y) {
  int ret = 1;
  while (y) {
    if (y & 1) ret = 1LL * x * ret % mod;
    x = 1LL * x * x % mod, y >>= 1;
  }
  return ret;
}
char t[N];
int n, fac[N], ifac[N];
inline int binom(int _n, int _m) {
  if (_n < 0 || _m < 0 || _n < _m) return 0;
  return 1LL * fac[_n] * ifac[_m] % mod * ifac[_n - _m] % mod;
}
inline int calc(int p0, int p1, int s0, int s1) {
  return (1LL * binom(p1 + s1 - 1, s1 + s0 - p0 - 1) * p1 +
          1LL * binom(p1 + s1, s1 - p0 + s0) * p0) %
         mod;
}
int main() {
  scanf("%s", t + 1), n = strlen(t + 1), fac[0] = 1;
  for (int i = 1; i <= n; i++) fac[i] = 1LL * fac[i - 1] * i % mod;
  ifac[n] = qpow(fac[n], mod - 2);
  for (int i = n - 1; ~i; i--) ifac[i] = 1LL * ifac[i + 1] * (i + 1) % mod;
  int p0 = 0, p1 = 0, s0 = 0, s1 = 0, ans = 0;
  for (int i = 1; i <= n; i++) s0 += t[i] == ')', s1 += t[i] == '?';
  for (int i = 1; i < n; i++) {
    if (t[i] == '(')
      p0++;
    else if (t[i] == ')')
      s0--;
    else
      p1++, s1--;
    if (p0 < s0)
      ans = add(ans, calc(p0, p1, s0, s1));
    else
      ans = add(ans, calc(s0, s1, p0, p1));
  }
  printf("%d\n", ans);
  return 0;
}
}  // namespace run
int main() { return run::main(); }
