#include #include #include using namespace std ; using ull = unsigned long long ; int n, k, at, covered[16][16], expr(), sym, refl, trans ; string s ; struct statement { int x, y, bits, r ; } ; vector prog ; int term() { switch (s[at++]) { default: return 1000 ; case '!': return 15-term() ; case 'x': return 10 ; case 'y': return 12 ; case '0': return 0 ; case '1': return 15 ; case '(': int r = expr() ; at++ ; return r ; } } int eqop() { int r=term() ; for (; s[at] == '='; at++, r ^= 15 ^ term()) ; return r ; } int andop() { int r = eqop() ; for (; s[at] == '&'; at++, r &= eqop()) ; return r ; } int orop() { int r = andop() ; for (; s[at] == '|'; at++, r |= andop()) ; return r ; } int expr() { int r = orop() ; for (; s[at] == '^'; at++, r ^= orop()) ; return r ; } ull res[1<<20] ; int get(int i) { return (res[i>>6]>>(i&63))&1 ; } int main() { cin >> n >> k ; int k2 = 1<> v.x >> v.y >> s >> v.r ; v.x-- ; v.y-- ; s.push_back('$') ; at = 0 ; v.bits = expr() ; if (v.bits & ~(covered[v.x][v.y])) { covered[v.x][v.y] |= v.bits ; prog.push_back(v) ; if (covered[v.x][v.y] == 15) break ; } } cin >> i ; prog.push_back({0, 0, 15, i}) ; for (int x=0; !(x>>k); x++) { for (int y=0; !(y>>k); y++) { for (auto v: prog) { if ((v.bits >> (((x >> v.x) & 1) + 2 * ((y >> v.y) & 1))) & 1) { j = v.r ; break ; } } i = x * m2 + y ; res[i>>6] |= j<<(i&63) ; } } for (int x=0; !(x>>k); x++) { for (int y=0; !(y>>k); y++) { if (get(x*m2+y) & get(y*m2+x)) sym++ ; if (get(y*m2+x)) for (int z=0; z