#include <bits/stdc++.h>
namespace fastIO {
static const int IN_BUF = 1 << 23, OUT_BUF = 1 << 23;
char buf[IN_BUF], *ps = buf, *pt = buf;
inline char my_getchar() {
  return ps == pt && (pt = (ps = buf) + fread(buf, 1, IN_BUF, stdin), ps == pt)
             ? EOF
             : *ps++;
}
template <typename T>
inline bool read(T &x) {
  char op = 0, ch = my_getchar();
  for (x = 0; !isdigit(ch) && ch != EOF; ch = my_getchar())
    if (ch == '-') op ^= 1;
  if (ch == EOF) return false;
  for (; isdigit(ch); ch = my_getchar()) x = x * 10 + (ch ^ '0');
  if (ch != '.')
    return op ? x = -x : 0, true;
  else
    ch = my_getchar();
  T t = 1;
  for (; isdigit(ch); ch = my_getchar()) t /= 10, x += (ch ^ '0') * t;
  return op ? x = -x : 0, true;
}
inline int reads(char *s) {
  int n = 0;
  char ch = my_getchar();
  for (; isspace(ch) && ch != EOF; ch = my_getchar())
    ;
  for (; !isspace(ch) && ch != EOF; ch = my_getchar()) s[n++] = ch;
  return s[n] = '\0', n;
}
char pbuf[OUT_BUF], *pp = pbuf;
struct _flusher {
  ~_flusher() { fwrite(pbuf, 1, pp - pbuf, stdout); }
} OutputFlusher;
inline void my_putchar(char x) {
  pp == pbuf + OUT_BUF ? fwrite(pbuf, 1, OUT_BUF, stdout), pp = pbuf : 0,
                                                           *pp++ = x;
}
template <typename T>
inline void print_(T x) {
  if (x == 0) return my_putchar('0'), void(0);
  std::vector<int> num;
  for (x < 0 ? my_putchar('-'), x = -x : 0; x; x /= 10) num.push_back(x % 10);
  while (!num.empty()) my_putchar(num.back() ^ '0'), num.pop_back();
}
template <typename T>
inline void print(T x, char ch = '\n') {
  print_(x), my_putchar(ch);
}
inline void prints_(const char *s, int n = -1) {
  if (n == -1) n = strlen(s);
  for (register int i = 0; i < n; ++i) my_putchar(s[i]);
}
inline void prints(const char *s, int n = -1, char ch = '\n') {
  prints_(s, n), my_putchar(ch);
}
template <typename T>
inline void printd_(T x, int n) {
  if (x < 0) x = -x, my_putchar('-');
  long long a, b;
  for (register int i = 0; i < n; ++i) x *= 10;
  x = (long long)(x + 0.5);
  for (register int i = 0; i < n; ++i) x /= 10;
  a = x, x -= a;
  for (register int i = 0; i < n; ++i) x *= 10;
  b = x;
  print_(a);
  if (n)
    my_putchar('.');
  else
    return;
  std::vector<int> num(n);
  for (register int i = 0; i < n; ++i) num[i] = b % 10, b /= 10;
  while (!num.empty()) my_putchar(num.back() ^ '0'), num.pop_back();
}
template <typename T>
inline void printd(T x, int n, char ch = '\n') {
  printd_(x, n), my_putchar(ch);
}
}  // namespace fastIO
using namespace fastIO;
const int P = 998244353, Inv2 = (P + 1) >> 1;
int n, m, l, r;
int qpow(int a, long long b) {
  int s = 1;
  for (; b; b >>= 1, a = 1ll * a * a % P)
    if (b & 1) s = 1ll * s * a % P;
  return s;
}
void solve() {
  read(n), read(m), read(l), read(r);
  if (1ll * n * m % 2 == 1) return print(qpow(r - l + 1, 1ll * n * m)), void(0);
  if ((r - l + 1) & 1)
    return print(1ll * (qpow(r - l + 1, 1ll * n * m) + 1) * Inv2 % P), void(0);
  else
    return print(1ll * qpow(r - l + 1, 1ll * n * m) * Inv2 % P), void(0);
}
int main() {
  int T = 1;
  while (T--) solve();
}
