#pragma once
template<size_tN>bitset<N>gcd(bitset<N>x,bitset<N>y){intxm=int(N)-1,ym=int(N)-1;while(xm!=-1&&x[xm]==0)xm--;while(ym!=-1&&y[ym]==0)ym--;if(xm<ym)swap(x,y),swap(xm,ym);while(ym>=0){x^=y<<(xm-ym);while(xm!=-1&&x[xm]==0)xm--;while(ym!=-1&&y[ym]==0)ym--;if(xm<ym)swap(x,y),swap(xm,ym);}returnx;}template<size_tMAX_H,size_tMAX_W>structBitMat{intH,W;bitset<MAX_W>a[MAX_H];BitMat(inth,intw):H(h),W(w){}inlinebitset<MAX_W>&operator[](inti){returna[i];}};template<size_tMAX_H,size_tMAX_W>intGauss(BitMat<MAX_H,MAX_W>&A,boolis_greater=true,boolis_extended=false){intrank=0,H=A.H,W=(is_extended?A.W-1:A.W);for(intj=(is_greater?W-1:0);j!=(is_greater?-1:W);j+=(is_greater?-1:1)){for(inti=rank;i<H;i++){if(A[i][j]==1){swap(A[rank],A[i]);for(intk=0;k<H;k++){if(k!=rank&&A[k][j])A[k]^=A[rank];}rank++;break;}}}if(is_extended){for(inti=rank;i<H;i++)if(A[i][W]==1)return-1;}returnrank;}template<size_tMAX_H,size_tMAX_W>voidOrthogonalComplement(BitMat<MAX_H,MAX_W>&A,intN){intrank=0;while(rank<N&&A[rank].any())rank++;for(inti=0;i<rank;i++){intj=A[i]._Find_first();if(j!=i)for(intk=0;k<rank;k++){intbuf=A[k][i];A[k][i]=A[k][j];A[k][j]=buf;}}for(inti=rank;i<N;i++){for(intj=0;j<N;j++){A[i][j]=(j<rank?A[j][i]:i==j);}}}