#include using namespace std; typedef unsigned int uint; typedef long long int ll; typedef unsigned long long int ull; #define debugv(v) printf("L%d %s => ",__LINE__,#v);for(auto e:v){cout< ",__LINE__,#m);for(int x=0;x<(w);x++){cout<<(m)[x]<<" ";}cout<>=1,k++)s=(s<<1)|(u&1);for(;0>=1)cout<<(s&1);}} #define TIME chrono::system_clock::now() #define MILLISEC(t) (chrono::duration_cast(t).count()) template ostream& operator <<(ostream &o,const pair p){o<<"("< memo; if (n<=pos) return 0; int key = pos|(stage<<24); if (memo.count(key)) return memo[key]; ll result = 0; if (stage == 0){ if (str[pos]=='('){ result+=dfsL(pos+1,stage+1); } result+=dfsL(pos+1,stage); }else if (stage == 1 || stage == 2){ if (str[pos]=='^'){ result+=dfsL(pos+1,stage+1); }else{ result+=dfsL(pos+1,stage); } }else if (stage == 3){ if (str[pos] == '*'){ result+=dfsL(pos+1,stage+1); }else{ result+=dfsL(pos+1,stage); } }else if (stage == 4){ if (str[pos] == ')'){ result++; } result+=dfsL(pos+1,stage); } return memo[key] = result; } // (*^^) ll dfsR(int pos=0,int stage=0){ static map memo; if (n<=pos) return 0; int key = pos|(stage<<24); if (memo.count(key)) return memo[key]; ll result = 0; if (stage == 0){ if (str[pos]=='('){ result+=dfsR(pos+1,stage+1); } result+=dfsR(pos+1,stage); }else if (stage == 1){ if (str[pos] == '*'){ result+=dfsR(pos+1,stage+1); }else{ result+=dfsR(pos+1,stage); } }else if (stage == 2 || stage == 3){ if (str[pos]=='^'){ result+=dfsR(pos+1,stage+1); }else{ result+=dfsR(pos+1,stage); } }else if (stage == 4){ if (str[pos] == ')'){ result++; } result+=dfsR(pos+1,stage); } return memo[key] = result; } int main(){ int i,j,k; ll x,y,a,b; cin >> str; n = str.size(); a = dfsL(); b = dfsR(); printf("%lld %lld\n",a,b); return 0; }