#ifdef NACHIA #define _GLIBCXX_DEBUG #else #define NDEBUG #endif #include #include #include #include #include #include #include #include #include using i64 = long long; using u64 = unsigned long long; #define rep(i,n) for(i64 i=0; i<(i64)(n); i++) #define repr(i,n) for(i64 i=(i64)(n)-1; i>=0; i--) const i64 INF = 1001001001001001001; const char* yn(bool x){ return x ? "Yes" : "No"; } template void chmin(A& l, const A& r){ if(r < l) l = r; } template void chmax(A& l, const A& r){ if(l < r) l = r; } template using nega_queue = std::priority_queue,std::greater>; using Modint = atcoder::static_modint<998244353>; //#include "nachia/vec.hpp" using namespace std; using Int = __int128_t; // tool assist : https://sigma.yosupo.jp/ // f(H,A)=$(y=0..H)$(a=0..H-A)$(b=0..H-A)[a<=y][y<=a+A-1][b<=y][y<=b+A-1]1 // g(H,A)=$(y=0..H)$(a=0..H-A)[a<=y][y<=a+A-1]1 Int f(Int H, Int A) { Int sum = Int(0); if (-1*A+H >= 0) { if (H+-1*A >= 0) { if (Int(-1)+A >= 0) { if (A+Int(-1) >= 0) { if (H >= 0) { sum += (Int(1)); } } } if (H >= 0) { if (H >= 0) { if (H >= 0) { if (-1*H+Int(-1)+A >= 0) { if (-1*H+Int(-1)+A >= 0) { sum += (1*H); } } } } } if (Int(-1)+A >= 0) { if (A+Int(-1) >= 0) { if (A+Int(-1) >= 0) { if (H+-1*A >= 0) { sum += (1*A+Int(-1)); } } } } } } if (A+Int(-1) >= 0) { if (H+-1*A >= 0) { if (Int(-1)+H >= 0) { if (Int(-1)+A >= 0) { if (H >= 0) { if (-1*A >= 0) { sum += (1*A); } } } } if (Int(-1)+-1*A+H >= 0) { if (Int(-1)+H >= 0) { if (H+Int(-1) >= 0) { if (A+Int(-1)+-1*H >= 0) { sum += ((1*H+2*H*A+-1*H*H+-2*A) / 2); } } } } } } if (-1*A+H >= 0) { if (H+-1*A >= 0) { if (H+Int(-1) >= 0) { if (A+Int(-1) >= 0) { if (H >= 0) { if (A+-1*H >= 0) { sum += (-1*A+1*H); } } } } if (A+Int(-1) >= 0) { if (-1*H+2*A+Int(-1) >= 0) { if (A >= 0) { if (-1*A+Int(-1)+H >= 0) { if (H+-1*A+Int(-1) >= 0) { sum += (2*H*A+-1*A*A+-1*A+-1*H*H+1*H); } } } } } if (Int(-1)+-1*H+2*A >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+A >= 0) { if (H+-1*A >= 0) { if (-1*A+H >= 0) { sum += (1*H*A+-1*H+1*A+-1*A*A); } } } } } if (A+Int(-1) >= 0) { if (H+Int(-1) >= 0) { if (H+Int(-1) >= 0) { if (A+-1*H+Int(-1) >= 0) { sum += (-1*H+1*A+1*H*H+-1*H*A); } } } } } } if (A+Int(-1) >= 0) { if (H+-1*A >= 0) { if (H >= 0) { if (H >= 0) { if (H >= 0) { if (Int(-1)+-1*A >= 0) { if (Int(-1)+A+-1*H >= 0) { sum += ((1*H+1*H*H) / 2); } } } } } if (Int(-1)+A >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+A >= 0) { if (-2*A+H >= 0) { if (-1*A+H >= 0) { sum += ((-1*A+1*A*A) / 2); } } } } } if (-1*A+Int(-1)+H >= 0) { if (Int(-1)+-1*A+H >= 0) { if (-1*A+Int(-1)+H >= 0) { if (Int(-1)+2*A+-1*H >= 0) { if (A >= 0) { sum += ((-1*H+1*A*A+1*A+-2*H*A+1*H*H) / 2); } } } } } } } if (-1*A+H >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+H >= 0) { if (H >= 0) { if (-1*A >= 0) { sum += (1*A); } } } } if (H+Int(-1) >= 0) { if (Int(-1)+-1*A+H >= 0) { if (Int(-1)+H >= 0) { if (-1*H+A >= 0) { sum += ((-2*A+-1*H*H+2*H*A+1*H) / 2); } } } } } } if (Int(-1)+A >= 0) { if (Int(-1)+A >= 0) { if (H+Int(-1) >= 0) { if (H+Int(-1) >= 0) { if (H >= 0) { if (-1*A >= 0) { if (-1*A >= 0) { sum += (1*A*A); } } } } } if (H+-1*A+Int(-1) >= 0) { if (Int(-1)+-1*A+H >= 0) { if (-1*A+H >= 0) { if (Int(-1)+A >= 0) { sum += ((3*A*A+-2*A*A*A+-1*A) / 6); } } } } if (H+Int(-1)+-1*A >= 0) { if (H+-1*A+Int(-1) >= 0) { if (Int(-1)+H >= 0) { sum += ((-6*H*H*A+6*H*A*A+-6*A*A+1*H+6*H*A+-3*H*H+2*H*H*H) / 6); } } } } } if (-1*A+H >= 0) { if (Int(-1)+A >= 0) { if (H+Int(-1) >= 0) { if (Int(-1)+H >= 0) { if (H >= 0) { if (A+-1*H >= 0) { if (-1*A >= 0) { sum += (1*H*A+-1*A*A); } } } } } if (H+-1*A+Int(-1) >= 0) { if (Int(-1)+H+-1*A >= 0) { if (H+-1*A >= 0) { if (-1*H+2*A >= 0) { if (Int(-1)+A >= 0) { sum += ((1*H*A+1*A*A*A+-1*H*A*A+-1*A*A) / 2); } } } } } if (A+Int(-1) >= 0) { if (A+Int(-1) >= 0) { if (A >= 0) { if (-2*A+Int(-1)+H >= 0) { if (Int(-1)+H+-1*A >= 0) { sum += ((4*H*A+-3*A*A*A+-1*H*H+1*H*H*H+-5*H*H*A+-3*A*A+7*H*A*A) / 2); } } } } } if (Int(-1)+A >= 0) { if (H+-1*A+Int(-1) >= 0) { if (H+Int(-1) >= 0) { sum += ((-1*H*H*H+-3*H*A+1*H*H+3*H*H*A+-2*H*A*A+2*A*A) / 2); } } } } } if (A+Int(-1) >= 0) { if (Int(-1)+A >= 0) { if (H+-2*A+Int(-1) >= 0) { if (-1*A+Int(-1)+H >= 0) { if (H+-1*A >= 0) { if (A >= 0) { if (Int(-1)+A >= 0) { sum += ((-1*A*A*A+1*A) / 6); } } } } } if (H+Int(-1) >= 0) { if (-1*A+Int(-1)+H >= 0) { if (H+Int(-1) >= 0) { if (-1*A >= 0) { sum += ((3*H*H*A+-2*H*H*H+-3*H*A+3*H*H+-1*H) / 6); } } } } if (H+-1*A+Int(-1) >= 0) { if (Int(-1)+H+-2*A >= 0) { if (-1*A+H+Int(-1) >= 0) { if (A+Int(-1) >= 0) { if (A >= 0) { sum += ((6*A*A+-2*H*H*H+1*A+-12*H*A*A+3*H*H+9*H*H*A+-1*H+5*A*A*A+-9*H*A) / 6); } } } } } } } if (H+-1*A >= 0) { if (-1*A+H >= 0) { if (A+Int(-1) >= 0) { if (H+Int(-1) >= 0) { if (H >= 0) { if (A+-1*H >= 0) { sum += (1*H+-1*A); } } } } if (Int(-1)+2*A+-1*H >= 0) { if (Int(-1)+A >= 0) { if (A >= 0) { if (-1*A+H >= 0) { if (-1*A+H+Int(-1) >= 0) { sum += (2*H*A+-1*A*A+-1*A+-1*H*H+1*H); } } } } } if (Int(-1)+H >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+H >= 0) { if (A+-1*H >= 0) { sum += (-1*H+-1*H*A+1*A+1*H*H); } } } } if (A+Int(-1) >= 0) { if (-1*H+Int(-1)+2*A >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+H+-1*A >= 0) { if (-1*A+H >= 0) { sum += (1*A+-1*H+1*H*A+-1*A*A); } } } } } } } if (A+Int(-1) >= 0) { if (-1*A+H >= 0) { if (Int(-1)+H >= 0) { if (Int(-1)+H >= 0) { if (H >= 0) { if (-1*A >= 0) { if (A+-1*H >= 0) { sum += (1*H*A+-1*A*A); } } } } } if (A+Int(-1) >= 0) { if (Int(-1)+A >= 0) { if (A >= 0) { if (H+-2*A >= 0) { if (-1*A+Int(-1)+H >= 0) { sum += ((-3*A*A*A+-5*H*H*A+-1*H*H+4*H*A+7*H*A*A+1*H*H*H+-3*A*A) / 2); } } } } } if (H+-1*A+Int(-1) >= 0) { if (H+Int(-1)+-1*A >= 0) { if (H+-1*A >= 0) { if (Int(-1)+2*A+-1*H >= 0) { if (Int(-1)+A >= 0) { sum += ((1*A*A*A+-1*A*A+1*H*A+-1*H*A*A) / 2); } } } } } if (-1*A+Int(-1)+H >= 0) { if (A+Int(-1) >= 0) { if (Int(-1)+H >= 0) { sum += ((2*A*A+-1*H*H*H+3*H*H*A+-3*H*A+-2*H*A*A+1*H*H) / 2); } } } } } if (-1*A+H >= 0) { if (-1*A+H >= 0) { if (Int(-1)+H >= 0) { if (Int(-1)+H >= 0) { if (H >= 0) { if (A+-1*H >= 0) { if (-1*H+A >= 0) { sum += (1*H*H+1*A*A+-2*H*A); } } } } } if (Int(-1)+A >= 0) { if (A+Int(-1) >= 0) { if (A >= 0) { if (-1*A+Int(-1)+H >= 0) { sum += (1*A*A*A+-1*H*H*H+1*A*A+3*H*H*A+1*H*H+-3*H*A*A+-2*H*A); } } } } if (Int(-1)+A >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+H >= 0) { sum += (-1*H*H+-1*A*A+-2*H*H*A+1*H*A*A+2*H*A+1*H*H*H); } } } } } if (A+Int(-1) >= 0) { if (-1*A+H >= 0) { if (H+Int(-1) >= 0) { if (A+Int(-1) >= 0) { if (H+Int(-1) >= 0) { if (-1*A >= 0) { sum += ((-1*H*H+1*H*H*H+1*H*A+-1*H*H*A) / 2); } } } } } } if (-1*A+H >= 0) { if (Int(-1)+A >= 0) { if (H >= 0) { if (H >= 0) { if (H >= 0) { if (Int(-1)+-1*H+A >= 0) { if (Int(-1)+-1*A >= 0) { sum += ((1*H*H+1*H) / 2); } } } } } if (H+-1*A+Int(-1) >= 0) { if (-1*A+H+Int(-1) >= 0) { if (-1*A+H+Int(-1) >= 0) { if (-1*H+2*A >= 0) { if (A >= 0) { sum += ((-1*H+1*A+1*A*A+1*H*H+-2*H*A) / 2); } } } } } if (Int(-1)+A >= 0) { if (A+Int(-1) >= 0) { if (Int(-1)+A >= 0) { if (-2*A+H+Int(-1) >= 0) { if (H+-1*A >= 0) { sum += ((-1*A+1*A*A) / 2); } } } } } } } if (Int(-1)+A >= 0) { if (Int(-1)+A >= 0) { if (Int(-1)+H+-1*A >= 0) { if (-2*A+H+Int(-1) >= 0) { if (-1*A+H >= 0) { if (A+Int(-1) >= 0) { if (A+Int(-1) >= 0) { sum += ((1*A+-1*A*A*A) / 6); } } } } } if (H+Int(-1)+-2*A >= 0) { if (-1*A+Int(-1)+H >= 0) { if (Int(-1)+-1*A+H >= 0) { if (A >= 0) { if (A >= 0) { sum += ((3*H*H+-1*H+-2*H*H*H+-9*H*A+6*A*A+-12*H*A*A+9*H*H*A+1*A+5*A*A*A) / 6); } } } } } if (Int(-1)+H+-1*A >= 0) { if (Int(-1)+H >= 0) { if (Int(-1)+H >= 0) { if (-1*A+Int(-1) >= 0) { sum += ((-2*H*H*H+-1*H+-3*H*A+3*H*H+3*H*H*A) / 6); } } } } } } if (H+-1*A >= 0) { if (Int(-1)+A >= 0) { if (A+Int(-1) >= 0) { if (H+Int(-1) >= 0) { if (Int(-1)+H >= 0) { if (Int(-1)+-1*A >= 0) { sum += ((1*H*H*H+-1*H*H+-1*H*H*A+1*H*A) / 2); } } } } } } if (A+Int(-1) >= 0) { if (Int(-1)+A >= 0) { if (H >= 0) { if (H >= 0) { if (H >= 0) { if (Int(-1)+-1*A >= 0) { if (-1*A+Int(-1) >= 0) { sum += ((3*H*H+1*H+2*H*H*H) / 6); } } } } } if (-1*A+Int(-1)+H >= 0) { if (H+Int(-1)+-1*A >= 0) { if (Int(-1)+H+-1*A >= 0) { if (A >= 0) { sum += ((6*H*A*A+-2*A*A*A+-3*A*A+6*H*A+-1*A+-6*H*H*A+-3*H*H+2*H*H*H+1*H) / 6); } } } } } } return sum; } Int g(Int H, Int A) { Int sum = Int(0); if (-1*A+H >= 0) { if (A+Int(-1) >= 0) { if (H >= 0) { sum += (Int(1)); } } if (H >= 0) { if (H >= 0) { if (Int(-1)+A+-1*H >= 0) { sum += (1*H); } } } if (A+Int(-1) >= 0) { if (Int(-1)+A >= 0) { if (H+-1*A >= 0) { sum += (Int(-1)+1*A); } } } } if (A+Int(-1) >= 0) { if (Int(-1)+H >= 0) { if (H >= 0) { if (-1*A >= 0) { sum += (1*A); } } } if (H+Int(-1)+-1*A >= 0) { if (-1*A+H >= 0) { if (A+Int(-1) >= 0) { sum += ((-1*A*A+1*A) / 2); } } } if (-1*A+Int(-1)+H >= 0) { if (Int(-1)+H >= 0) { sum += ((2*H*A+-2*A+1*H+-1*H*H) / 2); } } } if (H+-1*A >= 0) { if (H+Int(-1) >= 0) { if (H >= 0) { if (A+-1*H >= 0) { sum += (-1*A+1*H); } } } if (A+Int(-1) >= 0) { if (A >= 0) { if (Int(-1)+H+-1*A >= 0) { sum += (-1*A*A+-1*H*H+2*H*A+1*H+-1*A); } } } if (A+Int(-1) >= 0) { if (H+Int(-1) >= 0) { sum += (1*A+-1*H*A+1*H*H+-1*H); } } } if (A+Int(-1) >= 0) { if (H >= 0) { if (H >= 0) { if (-1*A+Int(-1) >= 0) { sum += ((1*H+1*H*H) / 2); } } } if (-1*A+Int(-1)+H >= 0) { if (H+Int(-1)+-1*A >= 0) { if (A >= 0) { sum += ((1*A*A+-2*H*A+1*A+-1*H+1*H*H) / 2); } } } } return sum; } void testcase(){ i64 H, W, A, B; cin >> H >> W >> A >> B; auto c1 = Modint(i64(g(H,A) % 998244353)) * Modint(i64(g(W,B) % 998244353)); auto c2 = Modint(i64(f(H,A) % 998244353)) * Modint(i64(f(W,B) % 998244353)); Modint q = Modint(H-A+1) * Modint(W-B+1); q = q.inv(); Modint ans = c1 * q * 2 - c2 * q * q; cout << ans.val() << endl; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); #ifdef NACHIA int T; cin >> T; for(int t=0; t