#pragma once
#include"library/bitwise/Util.hpp"
#define REP_(i, n) for (int i = 0; i < (n); i++)
#define RREP_(i, n) for (int i = (n) - 1; i >= 0; i--)
structBitwiseXor{template<typenameT>staticvoidzeta(std::vector<T>&A){constintn=bitwise::log2(A.size());REP_(i,n)REP_(S,1<<n){if(bitwise::in(S,i))continue;Tx=A[S],y=A[S|(1<<i)];A[S]-=y;A[S|(1<<i)]+=x;}}template<typenameT>staticvoidmobius(std::vector<T>&A){constintn=bitwise::log2(A.size());RREP_(i,n)REP_(S,1<<n){if(bitwise::in(S,i))continue;Tx=A[S],y=A[S|(1<<i)];A[S]+=y;A[S|(1<<i)]-=x;}Tinv=T(1)/(1<<n);REP(S,1<<n)A[S]*=inv;}template<typenameT>staticstd::vector<T>convolution(std::vector<T>A,std::vector<T>B){zeta(A);zeta(B);REP(S,A.size())A[S]*=B[S];mobius(A);returnA;}};#undef REP_
#undef RREP_
#line 2 "library/bitwise/Util.hpp"
namespacebitwise{staticintlog2(intN){intn=__builtin_ffs(N)-1;assert((1<<n)==N);returnn;}staticboolin(intS,inta){return(S>>a)&1;}}#line 3 "library/bitwise/Xor.hpp"
#define REP_(i, n) for (int i = 0; i < (n); i++)
#define RREP_(i, n) for (int i = (n) - 1; i >= 0; i--)
structBitwiseXor{template<typenameT>staticvoidzeta(std::vector<T>&A){constintn=bitwise::log2(A.size());REP_(i,n)REP_(S,1<<n){if(bitwise::in(S,i))continue;Tx=A[S],y=A[S|(1<<i)];A[S]-=y;A[S|(1<<i)]+=x;}}template<typenameT>staticvoidmobius(std::vector<T>&A){constintn=bitwise::log2(A.size());RREP_(i,n)REP_(S,1<<n){if(bitwise::in(S,i))continue;Tx=A[S],y=A[S|(1<<i)];A[S]+=y;A[S|(1<<i)]-=x;}Tinv=T(1)/(1<<n);REP(S,1<<n)A[S]*=inv;}template<typenameT>staticstd::vector<T>convolution(std::vector<T>A,std::vector<T>B){zeta(A);zeta(B);REP(S,A.size())A[S]*=B[S];mobius(A);returnA;}};#undef REP_
#undef RREP_