Alice has got addicted to a game called Sirtet recently.

In Sirtet, player is given an n × m grid. Initially a_{i,j} cubes are stacked up in the cell (i,j). Two cells are called adjacent if they share a side. Player can perform the following operations: 

  * stack up one cube in two adjacent cells; 
  * stack up two cubes in one cell. 



Cubes mentioned above are identical in height.

Here is an illustration of the game. States on the right are obtained by performing one of the above operations on the state on the left, and grey cubes are added due to the operation.

<image>

Player's goal is to make the height of all cells the same (i.e. so that each cell has the same number of cubes in it) using above operations. 

Alice, however, has found out that on some starting grids she may never reach the goal no matter what strategy she uses. Thus, she is wondering the number of initial grids such that 

  * L ≤ a_{i,j} ≤ R for all 1 ≤ i ≤ n, 1 ≤ j ≤ m; 
  * player can reach the goal using above operations. 



Please help Alice with it. Notice that the answer might be large, please output the desired value modulo 998,244,353.

Input

The only line contains four integers n, m, L and R (1≤ n,m,L,R ≤ 10^9, L ≤ R, n ⋅ m ≥ 2).

Output

Output one integer, representing the desired answer modulo 998,244,353.

Examples

Input


2 2 1 1


Output


1


Input


1 2 1 2


Output


2

Note

In the first sample, the only initial grid that satisfies the requirements is a_{1,1}=a_{2,1}=a_{1,2}=a_{2,2}=1. Thus the answer should be 1.

In the second sample, initial grids that satisfy the requirements are a_{1,1}=a_{1,2}=1 and a_{1,1}=a_{1,2}=2. Thus the answer should be 2.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-8;
const int MOD = 998244353;
const int dy[] = {1, 0, -1, 0}, dx[] = {0, -1, 0, 1};
const int dy8[] = {1, 1, 0, -1, -1, -1, 0, 1},
          dx8[] = {0, -1, -1, -1, 0, 1, 1, 1};
template <typename T, typename U>
inline bool chmax(T &a, U b) {
  return a < b ? (a = b, true) : false;
}
template <typename T, typename U>
inline bool chmin(T &a, U b) {
  return a > b ? (a = b, true) : false;
}
struct IOSetup {
  IOSetup() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  }
} iosetup;
int mod = MOD;
struct ModInt {
  unsigned val;
  ModInt() : val(0) {}
  ModInt(ll x) : val(x >= 0 ? x % mod : x % mod + mod) {}
  ModInt pow(ll exponent) {
    ModInt tmp = *this, res = 1;
    while (exponent > 0) {
      if (exponent & 1) res *= tmp;
      tmp *= tmp;
      exponent >>= 1;
    }
    return res;
  }
  ModInt &operator+=(const ModInt &x) {
    if ((val += x.val) >= mod) val -= mod;
    return *this;
  }
  ModInt &operator-=(const ModInt &x) {
    if ((val += mod - x.val) >= mod) val -= mod;
    return *this;
  }
  ModInt &operator*=(const ModInt &x) {
    val = static_cast<unsigned long long>(val) * x.val % mod;
    return *this;
  }
  ModInt &operator/=(const ModInt &x) {
    unsigned a = x.val, b = mod;
    int u = 1, v = 0;
    while (b) {
      unsigned tmp = a / b;
      swap(a -= tmp * b, b);
      swap(u -= tmp * v, v);
    }
    return *this *= u;
  }
  bool operator==(const ModInt &x) const { return val == x.val; }
  bool operator!=(const ModInt &x) const { return val != x.val; }
  bool operator<(const ModInt &x) const { return val < x.val; }
  bool operator<=(const ModInt &x) const { return val <= x.val; }
  bool operator>(const ModInt &x) const { return val > x.val; }
  bool operator>=(const ModInt &x) const { return val >= x.val; }
  ModInt &operator++() {
    if (++val == mod) val = 0;
    return *this;
  }
  ModInt operator++(int) {
    ModInt res = *this;
    ++*this;
    return res;
  }
  ModInt &operator--() {
    val = (val == 0 ? mod : val) - 1;
    return *this;
  }
  ModInt operator--(int) {
    ModInt res = *this;
    --*this;
    return res;
  }
  ModInt operator+() const { return *this; }
  ModInt operator-() const { return ModInt(val ? mod - val : 0); }
  ModInt operator+(const ModInt &x) const { return ModInt(*this) += x; }
  ModInt operator-(const ModInt &x) const { return ModInt(*this) -= x; }
  ModInt operator*(const ModInt &x) const { return ModInt(*this) *= x; }
  ModInt operator/(const ModInt &x) const { return ModInt(*this) /= x; }
  friend ostream &operator<<(ostream &os, const ModInt &x) {
    return os << x.val;
  }
  friend istream &operator>>(istream &is, ModInt &x) {
    ll val;
    is >> val;
    x = ModInt(val);
    return is;
  }
};
ModInt abs(const ModInt &x) { return x; }
struct Combinatorics {
  int val;
  vector<ModInt> fact, fact_inv, inv;
  Combinatorics(int val = 10000000)
      : val(val), fact(val + 1), fact_inv(val + 1), inv(val + 1) {
    fact[0] = 1;
    for (int i = (1); i < (val + 1); ++i) fact[i] = fact[i - 1] * i;
    fact_inv[val] = ModInt(1) / fact[val];
    for (int i = val; i > 0; --i) fact_inv[i - 1] = fact_inv[i] * i;
    for (int i = (1); i < (val + 1); ++i) inv[i] = fact[i - 1] * fact_inv[i];
  }
  ModInt nCk(int n, int k) {
    if (n < 0 || n < k || k < 0) return ModInt(0);
    return fact[n] * fact_inv[k] * fact_inv[n - k];
  }
  ModInt nPk(int n, int k) {
    if (n < 0 || n < k || k < 0) return ModInt(0);
    return fact[n] * fact_inv[n - k];
  }
  ModInt nHk(int n, int k) {
    if (n < 0 || k < 0) return ModInt(0);
    return (k == 0 ? ModInt(1) : nCk(n + k - 1, k));
  }
};
template <typename T>
struct Matrix {
  vector<vector<T>> dat;
  Matrix(int m, int n, T val = 0) : dat(m, vector<T>(n, val)) {}
  int height() const { return dat.size(); }
  int width() const { return dat.front().size(); }
  Matrix pow(ll exponent) {
    int n = height();
    Matrix<T> tmp = *this, res(n, n, 0);
    for (int i = (0); i < (n); ++i) res[i][i] = 1;
    while (exponent > 0) {
      if (exponent & 1) res *= tmp;
      tmp *= tmp;
      exponent >>= 1;
    }
    return res;
  }
  inline const vector<T> &operator[](const int idx) const { return dat[idx]; }
  inline vector<T> &operator[](const int idx) { return dat[idx]; }
  Matrix &operator=(const Matrix &x) {
    int m = x.height(), n = x.width();
    dat.resize(m, vector<T>(n));
    for (int i = (0); i < (m); ++i)
      for (int j = (0); j < (n); ++j) dat[i][j] = x[i][j];
    return *this;
  }
  Matrix &operator+=(const Matrix &x) {
    int m = height(), n = width();
    for (int i = (0); i < (m); ++i)
      for (int j = (0); j < (n); ++j) dat[i][j] += x[i][j];
    return *this;
  }
  Matrix &operator-=(const Matrix &x) {
    int m = height(), n = width();
    for (int i = (0); i < (m); ++i)
      for (int j = (0); j < (n); ++j) dat[i][j] -= x[i][j];
    return *this;
  }
  Matrix &operator*=(const Matrix &x) {
    int m = height(), n = x.width(), l = width();
    vector<vector<T>> res(m, vector<T>(n, 0));
    for (int i = (0); i < (m); ++i)
      for (int j = (0); j < (n); ++j) {
        for (int k = (0); k < (l); ++k) res[i][j] += dat[i][k] * x[k][j];
      }
    swap(dat, res);
    return *this;
  }
  Matrix operator+(const Matrix &x) const { return Matrix(*this) += x; }
  Matrix operator-(const Matrix &x) const { return Matrix(*this) -= x; }
  Matrix operator*(const Matrix &x) const { return Matrix(*this) *= x; }
};
int main() {
  int n, m, l, r;
  cin >> n >> m >> l >> r;
  ll grid = 1LL * n * m;
  if (grid & 1) {
    cout << ModInt(r - l + 1).pow(grid) << '\n';
  } else {
    int even = r / 2 - (l - 1) / 2, odd = (r - l + 1) - even;
    Matrix<ModInt> m(2, 2), dp(2, 1);
    m[0][0] = even;
    m[0][1] = odd;
    m[1][0] = odd;
    m[1][1] = even;
    dp[0][0] = 1;
    dp[1][0] = 0;
    cout << (m.pow(grid) * dp)[0][0] << '\n';
  }
  return 0;
}
