output_description: Print the number of ways in which the squares can be painted in the end,
  modulo 998244353.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      A B C D
attempt: # AGC046-B Extension
  """
  https://maspypy.com/atcoder-%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3-2020-06-20agc046
  「操作列の結果、完成図としてありうるものを数えよ」
  という問題は、複数の操作後の完成図が同じ結果を取りうることを考慮し、
  ・完成図としてあり得るパターンの同値な言い換えを探す
  ・操作に制約を加えても同じ完成図を作成できることが一意になる
  のどちらかを目指して、考察していく。
  
  以下、問題の「縦を選んだ場合のマスの変化」は上ではなく下として考える。
  
  ケース2の
  2 1 3 4
  について考える。
  これは縦に1回と横に3回の追加を行うが、
  実は縦の制御について、最も左端に存在する黒タイルについて場合分けをして良い。
  w???
  w???
  b???
  の盤面について考えた時、これは初手に縦の操作を選ぶことで達成できるが、
  そうでないような操作で上図と同じような盤面になったとして、実は左下の位置が
  黒になるような場合、？の位置もまた同じように決定されるので、そのような
  操作は考慮しなくて良いことが分かる。
  
  そのような操作とは、つまり、"縦方向の拡張を最速で行わなかった"ような操作である。
  考察すべき2つめの条件、操作に制約を加えても同じ完成図を作成できることが一意になる
  を達成することができた。
  
  この時の?の組み合わせは、横拡張3回のうち、すべての拡張で3つを選べるので、
  3*3通り
  である。
  次は、一番下の行で、初めて黒が出る位置を1つずつずらして考えていく。
  w???
  w???
  wb??
  
  この場合、右に1回横拡張を挟んで、すぐさま縦拡張,そのあと横拡張を2回行うので、
  2*3*3
  
  w???
  w???
  wwb?
  
  2*2*3
  
  w???
  w???
  wwwb
  
  2*2*2
  
  よって合計65通りとなる。
  
  この操作をdpによって拡張する。
  具体的には、
  dp[i][j]:横幅iの時点で残りの縦幅がjの時、縦幅を利用する際の通し数
  """
  import sys
  
  readline = sys.stdin.buffer.readline
  
  
  def even(n):
      return 1 if n % 2 == 0 else 0
  
  
  A, B, C, D = map(int, readline().split())
  mod = 998244353
  dp0 = [[0] * (D + 1) for _ in range(C + 1)]
  dp1 = [[0] * (D + 1) for _ in range(C + 1)]
  
  
  dp0[A][B] = 1
  
  for x in range(A, C + 1):
      for y in range(B, D + 1):
          if x == A and y == B:
              continue
          dp0[x][y] = (dp0[x][y - 1] * x + dp1[x][y - 1] * 1) % mod
          dp1[x][y] = (dp0[x - 1][y] * y + dp1[x - 1][y] * y) % mod
  
  ans = (dp0[C][D] + dp1[C][D]) % mod
  print(ans)
  
problem_description: Statement
  
  We have a grid with A horizontal rows and B vertical columns, with the squares
  painted white. On this grid, we will repeatedly apply the following operation:
  
    * Assume that the grid currently has a horizontal rows and b vertical columns. Choose "vertical" or "horizontal".
      * If we choose "vertical", insert one row at the top of the grid, resulting in an (a+1) \times b grid.
      * If we choose "horizontal", insert one column at the right end of the grid, resulting in an a \times (b+1) grid.
    * Then, paint one of the added squares black, and the other squares white.
  
  Assume the grid eventually has C horizontal rows and D vertical columns. Find
  the number of ways in which the squares can be painted in the end, modulo
  998244353.
samples: [{"input": "1 1 2 2", "output": "3\n    \n\nAny two of the three squares other than the bottom-left square can be painted\nblack.\n\n* * *"}, {"input": "2 1 3 4", "output": "65\n    \n\n* * *"}, {"input": "31 41 59 265", "output": "387222020"}]