← Home
#include<bits/stdc++.h>
#define ll long long
#define ci const int
using namespace std;ci N=5e5+5,mod=998244353,ir=(mod+1)/3;int n,fac[N],inv[N],lst,ans,A[1<<20],B[1<<20];int lim,R[1<<20];vector<int>c;char s[N];inline int Mod(int x){return(x>=mod)?x-mod:x;}int C(int n,int m){return(ll)fac[n]*inv[m]%mod*inv[n-m]%mod;}void cln(int n){lim=1;while(lim<=n)lim<<=1;for(int i=0;i<lim;++i)R[i]=(R[i>>1]>>1)|((i&1)*(lim>>1)),A[i]=B[i]=0;}int ksm(int x,int y){int res=1;for(;y;y>>=1,x=(ll)x*x%mod)if(y&1)res=(ll)res*x%mod;return res;}void NTT(int*a,int ty){for(int i=0;i<lim;++i)if(i<R[i])swap(a[i],a[R[i]]);int X,Y,w,wn;for(int mid=1;mid<lim;mid<<=1){wn=ksm((ty==1)?3:ir,(mod-1)/(mid<<1));for(int j=0,R=mid<<1;j<lim;j+=R){w=1;for(int k=0;k<mid;++k,w=(ll)w*wn%mod){X=a[j|k],Y=(ll)w*a[j|k|mid]%mod;a[j|k]=Mod(X+Y),a[j|k|mid]=Mod(X-Y+mod);}}}if(ty==-1){int in=ksm(lim,mod-2);for(int i=0;i<lim;++i)a[i]=(ll)a[i]*in%mod;}}
void solve(int l,int r,int dt,vector<int>&f){
	if(l==r)return;
	if(r-l==1){
		if(c[l]!=c[r])f.push_back(0);
		for(int i=f.size()-1;i>dt;--i)f[i]=Mod(f[i]+f[i-1]);
		return;
	}
	int mid=l+r>>1,x=c[r]-dt-(r-l);
	if(x<0){
		solve(l,mid,dt,f);
		solve(mid,r,dt,f);
		return;
	}
	if(x+dt<c[l])solve(l,mid,dt+x+1,f),solve(mid,r,dt+x+1,f);
	cln(c[r]-dt);
	for(int i=0;i<=x;++i)A[i]=f[dt+i];
	for(int i=0;i<=r-l;++i)B[i]=C(r-l,i);
	NTT(A,1),NTT(B,1);
	for(int i=0;i<lim;++i)A[i]=(ll)A[i]*B[i]%mod;
	NTT(A,-1);
	while(f.size()<=c[r])f.push_back(0);
	for(int i=dt;i<=dt+x;++i)f[i]=A[i-dt];
	for(int i=dt+x+1;i<=c[r];++i)f[i]=Mod(f[i]+A[i-dt]);
	return;
}
int calc(){
	if(c.empty())return 1;
	reverse(c.begin(),c.end());
	for(int i=1;i<c.size();++i)c[i]+=c[i-1];
	vector<int>f;
	f.push_back(1),f.push_back(1);
	solve(0,c.size()-1,0,f);
	return f.back();
}
int main(){
	scanf("%s",s+1);
	n=strlen(s+1);
	fac[0]=fac[1]=inv[0]=inv[1]=1;
	for(int i=2;i<=n;++i)fac[i]=(ll)fac[i-1]*i%mod,inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
	for(int i=2;i<=n;++i)inv[i]=(ll)inv[i]*inv[i-1]%mod;
	for(int i=1,tp=0;i<=n;++i){
		if(s[i]=='(')++tp;
		else{
			if(!tp)lst=i;
			else --tp;
		}
	}
	for(int i=1,tp=0;i<=lst;++i){
		if(s[i]=='(')++tp;
		else{
			if(!tp)c.push_back(1);
			else c.push_back(0),--tp;
		}
	}
	ans=calc(),lst=n+1;
	for(int i=n,tp=0;i;--i){
		if(s[i]==')')++tp;
		else{
			if(!tp)lst=i;
			else --tp;
		}
	}
	c.clear();
	for(int i=n,tp=0;i>=lst;--i){
		if(s[i]==')')++tp;
		else{
			if(!tp)c.push_back(1);
			else c.push_back(0),--tp;
		}
	}
	ans=(ll)ans*calc()%mod;
	printf("%d\n",ans);
	return 0;
}