結果
問題 | No.2409 Strange Werewolves |
ユーザー | ococonomy1 |
提出日時 | 2023-08-11 21:32:07 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 28 ms / 2,000 ms |
コード長 | 3,252 bytes |
コンパイル時間 | 1,065 ms |
コンパイル使用メモリ | 112,024 KB |
実行使用メモリ | 24,376 KB |
最終ジャッジ日時 | 2024-11-18 15:30:01 |
合計ジャッジ時間 | 1,799 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 16 |
ソースコード
// #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include <algorithm> #include <bitset> #include <cassert> #include <climits> #include <cmath> #include <complex> #include <deque> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <set> #include <string> #include <tuple> #include <vector> using namespace std; using lg = long long; using pii = pair<int, int>; using pll = pair<lg, lg>; #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<long long> 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; }