#include using namespace std; #include using namespace atcoder; using mint=modint998244353; int main(void) { vector fact(5e5,1); vector finv(5e5,1); for(int i=2;i<5e5;++i){ fact[i]=fact[i-1]*i; finv[i]=finv[i-1]/i; } int t; cin >> t; vector,int>> nm(t); for(int i=0;i> nm[i].first.first >> nm[i].first.second; nm[i].second=i; } int rtt=sqrt(t); sort(nm.begin(),nm.end(),[&](auto const & lhs, auto const & rhs) { if(lhs.first.second/rttrhs.first.second/rtt){ return false; } return lhs.first.first ans(t); mint cur=0; int prevn=INT_MAX,prevm=0; for(int i=0;in){ cur=0; for(int j=1;j<=m;++j){ if(2*j-2>=n-1){ cur+=fact[2*j-2]*finv[n-1]*finv[(2*j-2)-(n-1)]; } } } else { for(int j=prevn+1;j<=n;++j){ if(2*prevm>=j){ cur=(fact[2*prevm]*finv[j]*finv[2*prevm-j]-cur)*finv[2]; } else { cur=-cur*finv[2]; } } if(prevm=n-1){ cur+=fact[2*j-2]*finv[n-1]*finv[(2*j-2)-(n-1)]; } } } if(prevm>m){ for(int j=prevm;j>m;--j){ if(2*j-2>=n-1){ cur-=fact[2*j-2]*finv[n-1]*finv[(2*j-2)-(n-1)]; } } } } ans[q]=cur; prevn=n; prevm=m; } for(int i=0;i