結果
| 問題 |
No.2409 Strange Werewolves
|
| コンテスト | |
| ユーザー |
k1suxu
|
| 提出日時 | 2023-08-11 23:06:13 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 106 ms / 2,000 ms |
| コード長 | 2,609 bytes |
| コンパイル時間 | 3,183 ms |
| コンパイル使用メモリ | 249,436 KB |
| 実行使用メモリ | 15,980 KB |
| 最終ジャッジ日時 | 2024-11-18 18:23:36 |
| 合計ジャッジ時間 | 4,770 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 16 |
ソースコード
// #pragma GCC target("avx")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i = 0; i < (int)n; i++)
#define FOR(n) for(int i = 0; i < (int)n; i++)
#define repi(i,a,b) for(int i = (int)a; i < (int)b; i++)
#define all(x) x.begin(),x.end()
//#define mp make_pair
#define vi vector<int>
#define vvi vector<vi>
#define vvvi vector<vvi>
#define vvvvi vector<vvvi>
#define pii pair<int,int>
#define vpii vector<pair<int,int>>
template<typename T>
void chmax(T &a, const T &b) {a = (a > b? a : b);}
template<typename T>
void chmin(T &a, const T &b) {a = (a < b? a : b);}
using ll = long long;
using ld = long double;
using ull = unsigned long long;
const ll INF = numeric_limits<long long>::max() / 2;
const ld pi = 3.1415926535897932384626433832795028;
const ll mod = 998244353;
int dx[] = {1, 0, -1, 0, -1, -1, 1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
#define int long long
vector<long long> f = {1}, rf = {1};
long long inv(long long x) {
long long res = 1;
long long k = mod - 2;
long long y = x;
while (k) {
if (k & 1) res = (res * y) % mod;
y = (y * y) % mod;
k /= 2;
}
return res;
}
// void init(long long n) {
// f.resize(n, 0);
// rf.resize(n, 0);
// f[0] = 1;
// repi(i, 1, n) f[i] = (f[i - 1] * i) % mod;
// repi(i, 0, n) rf[i] = inv(f[i]);
// }
//---------------------------------------------------------------------------------------------------
long long P(long long n, long long k) {
while(n > f.size() - 1) {
f.push_back(f.back() * f.size() % mod);
rf.push_back(inv(f.back()));
}
long long a = f[n];
long long b = rf[n - k];
return a * b % mod;
}
long long C(long long n, long long k) {
while(n > f.size() - 1) {
f.push_back(f.back() * f.size() % mod);
rf.push_back(inv(f.back()));
}
long long a = f[n]; // = n!
long long b = rf[n-k]; // = (n-k)!
long long c = rf[k]; // = k!
long long bc = (b * c) % mod;
return (a * bc) % mod;
}
long long H(long long n, long long k) {
return C(n + k - 1, k);
}
//カタラン数
long long Cat(long long n) {
long long ret = C(2*n, n)-C(2*n, n-1);
return (ret % mod + mod) % mod;
}
void solve() {
int x, y, z, w;
cin >> x >> y >> z >> w;
int ans = P(x, x-z)*P(y, y-w)%mod;
if(z == 0) ans *= C(x-z+y-w-1, y-w);
else ans *= C(x-z+y-w-1, x-z);
cout << ans%mod << endl;
}
signed main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
solve();
return 0;
}
k1suxu