// #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using lg = long long; using pii = pair; using pll = pair; #define TEST cerr << "TEST" << endl #define AMARI 998244353 // #define AMARI 1000000007 #define TEMOTO ((sizeof(long double) == 16) ? false : true) #define TIME_LIMIT 1980 * (TEMOTO ? 1 : 1000) #define mpr make_pair #define el '\n' #define El '\n' //CombinationやPermutationなど //前処理O(N),計算O(1) class ococo_combination { private: long long n, p; vector kaizyou, gyakugen, gyakugen_kaizyou; public: //二項係数に出てくる最大値をaに変更する //O(1) ここで変更したaが他の関数の計算時間に影響を与える。 void update_max(int a) { n = a; kaizyou.resize(n); gyakugen.resize(n); gyakugen_kaizyou.resize(n); } //素数で割った余りを出力する時その余りをpに変更する //a = 0にすると余りは出さずに計算する //O(1) void update_mod(int a) { p = a; } //前処理を行う update_maxとupdate_modを先にやった方が良い //O(N) void maesyori(void) { kaizyou[0] = 1; gyakugen[0] = 1; gyakugen_kaizyou[0] = 1; kaizyou[1] = 1; gyakugen[1] = 1; gyakugen_kaizyou[1] = 1; for (int i = 2; i < n; i++) { kaizyou[i] = kaizyou[i - 1] * i % p; gyakugen[i] = p - gyakugen[p % i] * (p / i) % p; gyakugen_kaizyou[i] = gyakugen_kaizyou[i - 1] * gyakugen[i] % p; } } //二項係数nCkの計算を行う //O(1) long long nCk(int n, int k) { if (n < k || n < 0 || k < 0)return 0; else { long long ans = kaizyou[n]; long long kari = gyakugen_kaizyou[n - k]; kari %= p; kari *= gyakugen_kaizyou[k]; kari %= p; ans *= kari; ans %= p; return ans; } } long long nPk(int n,int k){ if(n < k || n < 0 || k < 0)return 0; else { long long ans = (kaizyou[n] * gyakugen_kaizyou[n - k]) % AMARI; return ans; } } long long n_kaizyou(int n){ return kaizyou[n]; } }; #define MULTI_TEST_CASE false void solve(void) { int x,y,z,w; cin >> x >> y >> z >> w; ococo_combination oc; oc.update_max(x + y + z + w); oc.update_mod(AMARI); oc.maesyori(); if(w == 0){ swap(x,y); swap(z,w); } lg ans = oc.nCk(x,x - 1); ans *= oc.nCk(y,y-w); ans %= AMARI; ans *= oc.n_kaizyou(x - 1 + y - w); cout << ans % AMARI << el; return; } void calc(void) { return; } int main(void) { cin.tie(nullptr); ios::sync_with_stdio(false); calc(); int t = 1; if(MULTI_TEST_CASE) cin >> t; while(t--) { solve(); } return 0; }