ll@(h,w,k,m),hw=h*w; unionFind u[hw+1]; rep(i,hw+1){ u[i].malloc(hw,1); } mint().setmod(m); mint a,z,c[hw+1],e[hw+1]; rep(i,hw){ a+=mint(1)/(i+1); } rep(i,hw+1){ c[i]=mint(i)**k; } rep(b,1,1<<hw){ int d=BIT_popcount(b); copy(u[d-1].d,u[d-1].d+hw,u[d].d); int j=BIT_ctz(b); mint x=e[d-1]+c[1]; if((j+1)%w && b&1<<j+1){ x-=c[u[d].size(j+1)]+c[1]; u[d](j,j+1); x+=c[u[d].size(j)]; } if(b&1l<<j+w && u[d](j)!=u[d](j+w)){ x-=c[u[d].size(j+w)]+c[u[d].size(j)]; u[d](j,j+w); x+=c[u[d].size(j)]; } e[d]=x; z+=x; } wt(a*z/mint(2)**hw);