#include #include #include using namespace std; using vi=vector; using vvi=vector; using vu=vector; set h; void bit_set(vu& d, int b, int v) { if(v) d[b/32]|=(1<<(b%32)); else d[b/32]&=~(1<<(b%32)); } int bit_get(vu& d, int b) { return (d[b/32]>>(b%32))&1; } void bit_inv(vu& d, int b) { bit_set(d, b, 1-bit_get(d, b)); } void solve_i(vu& w, const vvi& ef, const vvi& eb, int& ret) { int i, n=ef.size(); vu ww; if(h.find(w)!=h.end()) return; if(ret) return; h.insert(w); for(i=0;i=n) { ret=1; return; } for(auto ebe:eb[i]) { ww=w; for(auto efe:ef[ebe]) { bit_inv(ww, efe); } solve_i(ww, ef, eb, ret); if(ret) break; } } int solve(vu& w, vvi& ef, vvi& eb) { int ret=0; h.clear(); solve_i(w, ef, eb, ret); return ret; } int main(void) { int n, i, ni, pi; vi d; vvi ef, eb; vu w; while(scanf("%d", &n)==1) { eb.clear(); eb.resize(n); ef=eb; w.assign((n+31)/32, 0); d.resize(n); for(i=0;i