#pragma once
template<typenamemint>mintHafnian(vector<vector<mint>>&mat){usingvm=vector<mint>;usingvvm=vector<vector<mint>>;intn=mat.size();assert(n%2==0);inth=n/2+1;autoad=[&h](vm&x,constvm&a,constvm&b)->void{for(inti=0;i<h-1;i++)for(intj=0;j<h-1-i;j++)x[i+j+1]+=a[i]*b[j];};autosolve=[&](autorc,constvector<vvm>&v)->vm{vmans(h);if(sz(v)==0){ans[0]=1;returnans;}intm=v.size()-2;autoV=v;V.resize(m);vmzero=rc(rc,V);for(inti=0;i<m;i++)for(intj=0;j<i;j++){ad(V[i][j],v[m][i],v[m+1][j]);ad(V[i][j],v[m+1][i],v[m][j]);}vmone=rc(rc,V);for(inti=0;i<h;i++)ans[i]+=one[i]-zero[i];ad(ans,one,v[m+1][m]);returnans;};vector<vvm>v(n);for(inti=0;i<n;i++){v[i].resize(i,vm(h,0));for(intj=0;j<i;j++)v[i][j][0]=mat[i][j];}returnsolve(solve,v).back();}