#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;
}