#include #include using namespace std; using namespace atcoder; using ll=long long; using ldub=long double; using lldub=__float128; using str=string; using mint=modint; template using tup2=tuple; template using tup3=tuple; template using tup4=tuple; template using tup5=tuple; template using tup6=tuple; template using tup7=tuple; template using vec=vector; template using vec2=vector>; template using vec3=vector>; template using vec4=vector>; template using vec5=vector>; template using vec6=vector>; template using que=queue; template using Pque=priority_queue; template using pque=priority_queue, greater>; struct Edge{ ll from,to,w=1,num=-1; }; using gvec=vector; using gvec2=vector; template bool chmax(T &a,T b){if(a bool chmin(T &a,T b){if(b f(ll N){ vec A; { ll n=N-1; A.pb(n); while(n){ n^=(1<=2;k--){ if((((N-1)>>k)&1)==0) continue; ll n=s; vec B((1<>1)&1)<<1; f^=((B[i]>>1)&1)<<(k-1); f^=((B[i]>>(k-1))&1)<<1; f^=((B[i]>>(k-1))&1)<<(k-1); B[i]^=f; } if((pops(s)+pops((N-1)>>2))&1) reverse(all(B)); for(ll i=0;i<(1<>1)&1)==1) A.pb(N-3); return A; } void solve(){ ll N,M; cin >> N >> M; if((N&1)||(M&1)){ cout << -1 << endl; return; } vec P=f(N); vec Q=f(M); vec2 dp(21,vec(21,INF)); vec2 pre(21,vec(21)); dp[20][20]=0; for(ll k=20;k>=0;k--){ for(ll l=20;l>=0;l--){ if(k!=20&&chmin(dp[k][l],(dp[k+1][l]<<1)+(((N-1)>>k)&1))) pre[k][l]=0; if(l!=20&&chmin(dp[k][l],(dp[k][l+1]<<1)+(((M-1)>>l)&1))) pre[k][l]=1; } } vec X(20),Y(20); { ll h=0,w=0; while(tup(h,w)!=tup(20,20)){ if(pre[h][w]==0){ X[h]=h+w; h++; }else{ Y[w]=h+w; w++; } } } vec2 A(N,vec(M)); for(ll i=0;i>k)&1)<>l)&1)<> T; while(T--) solve(); return 0; }