#include #include #include #include #include #include using std::cin, std::cout, std::string; typedef unsigned long long ull; template struct Array{ constexpr Array(){}; constexpr Array(const std::initializer_list list){ std::copy(list.begin(),list.end(),arr); } #ifdef NDEBUG #define NDB_NOEXCEPT noexcept #define NDB_CONSTEXPR constexpr #else #define NDB_NOEXCEPT #define NDB_CONSTEXPR #endif NDB_CONSTEXPR T& operator[](const size_t n)NDB_NOEXCEPT{ #ifndef NDEBUG if(n>=size){ std::ostringstream err_oss; err_oss<<"\n[array_size]: "<now!=that.now; } NDB_CONSTEXPR T& operator*()const NDB_NOEXCEPT{ #ifndef NDEBUG if(now>=size){ std::ostringstream err_oss; err_oss<<"[array_size]: "< constexpr static Array make_array(const Args&...args){ Array arr; size_t index {0}; ((arr[index++]=args),...); return arr; } static const size_t MOD {998244353}, MAX_N {300000+5}; static string s; static size_t unused_left_num, ans; static Array left_dp, last_left; static Array stk; int main(){ cin>>s; for(size_t i {1};i<=s.size();i++){ if(s[i-1]=='('){ stk[unused_left_num++]=i; }else if(unused_left_num>0){ last_left[i] = stk[--unused_left_num]; left_dp[i] = (left_dp[last_left[i]-1] + last_left[i]) % MOD; ans = (ans + left_dp[i] * (s.size() - i+1)) % MOD ; } } cout<