#include using namespace std; typedef long long ll; typedef pair p_ll; template void debug(T itr1, T itr2) { auto now = itr1; while(now=0; i--) const ll LLINF = pow(2,61)-1; const int INF = pow(2,30)-1; ll gcd(ll a, ll b) { if (a (const MLL &p) const { return x> p.x; } bool operator>= (const MLL &p) const { return x>=p.x; } MLL pow(MLL n) const { MLL result(1), p(x); ll tn = n.x; while(tn){ if (tn&1) result*=p; p*=p; tn>>=1; } return result; } MLL inv() const { return pow(MOD-2); } }; MLL operator+ (ll x, MLL p) { return (MLL)x+p; } MLL operator- (ll x, MLL p) { return (MLL)x-p; } MLL operator* (ll x, MLL p) { return (MLL)x*p; } MLL operator/ (ll x, MLL p) { return (MLL)x/p; } vector fac; void c_fac(ll x=pow(10,7)+10) { fac.resize(x); rep(i,x) fac[i] = i ? fac[i-1]*i : 1; } MLL nck(MLL n, MLL k) { return fac[n.x]/(fac[k.x]*fac[(n-k).x]); }; ostream &operator<< (ostream &ost, const MLL &p) { return ost << p.x; } istream &operator>> (istream &ist, MLL &p) { return ist >> p.x; } // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- vector cmax(vector v1, vector v2) { return { v1[0]*v2[0], v1[0]*v2[1] + v1[1]*v2[0] + v1[1]*v2[1], v1[0]*v2[2] + v1[1]*v2[2] + v1[2]*v2[0] + v1[2]*v2[1] + v1[2]*v2[2], }; } vector cmex(vector v1, vector v2) { return { v1[1]*v2[1] + v1[1]*v2[2] + v1[2]*v2[1] + v1[2]*v2[2], v1[0]*v2[0] + v1[0]*v2[2] + v1[2]*v2[0], v1[0]*v2[1] + v1[1]*v2[0] }; } vector cm_x(vector v1, vector v2) { vector ma = cmax(v1, v2), me = cmex(v1, v2); return { ma[0] + me[0], ma[1] + me[1], ma[2] + me[2] }; } int main() { string S; cin >> S; ll K; cin >> K; assert(1<=S.size() && S.size()<=2*pow(10,5)); assert(K==0||K==1||K==2); stack op; stack> dp; for (int i=0; i n1 = dp.top(); dp.pop(); vector n2 = dp.top(); dp.pop(); string o = op.top(); op.pop(); if (o=="max") dp.push(cmax(n1,n2)); else if (o=="mex") dp.push(cmex(n1,n2)); else if (o=="m?x") dp.push(cm_x(n1,n2)); else assert(false); i++; } else { if (S[i]=='?') dp.push({1,1,1}); else if (S[i]=='0') dp.push({1,0,0}); else if (S[i]=='1') dp.push({0,1,0}); else if (S[i]=='2') dp.push({0,0,1}); else assert(false); i++; } } assert(op.size()==0 && dp.size()==1); MLL result = dp.top()[K]; cout << result << endl; return 0; }