#pragma once
vector<mint>LinearEquation_hashmap(vector<HashMap<int,mint>>A,vector<mint>b,intupper=-1){intH=A.size(),W=b.size();if(upper=-1)upper=W;vector<int>pivots(W,-1);intrank=0,je=W;for(intj=0;j<je;j++){intidx=-1;for(inti=rank;i<H;i++){autoit=A[i].find(j);if(it!=end(A[i])andit->second!=mint{}){idx=i;break;}}if(idx==-1)continue;if(rank!=idx){swap(A[rank],A[idx]);swap(b[rank],b[idx]);}pivots[j]=rank;vector<pair<int,mint>>arank;{mintcoeff=A[rank][j].inverse();if(coeff*A[rank][j]!=1)return{};for(auto&[k,v]:A[rank]){if(v!=mint{}){v*=coeff;arank.emplace_back(k,v);}}b[rank]*=coeff;}for(inti=rank+1;i<min(H,rank+upper+1);i++){autoit=A[i].find(j);if(it!=end(A[i])andit->second!=mint{}){mintcoeff=(it->second);for(auto&[k,v]:arank)A[i][k]-=v*coeff;b[i]-=b[rank]*coeff;}}rank++;}vector<mint>res(W);for(intj=W-1;j>=0;j--){if(pivots[j]!=-1){inti=pivots[j];for(auto&[k,v]:A[i])b[i]-=v*res[k];res[j]=b[i];}}for(inti=rank;i<H;i++){mintl=0;for(auto&[k,v]:A[i])l+=res[k]*v;if(l!=b[i])return{};}returnres;}