結果

問題 No.1691 Badugi
ユーザー 👑 NachiaNachia
提出日時 2021-08-07 14:41:51
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 52 ms / 2,000 ms
コード長 4,392 bytes
コンパイル時間 671 ms
コンパイル使用メモリ 82,256 KB
実行使用メモリ 20,864 KB
最終ジャッジ日時 2024-07-05 09:49:35
合計ジャッジ時間 1,595 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 52 ms
20,864 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 1 ms
5,376 KB
testcase_06 AC 1 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 35 ms
14,976 KB
testcase_09 AC 34 ms
14,976 KB
testcase_10 AC 52 ms
20,864 KB
testcase_11 AC 4 ms
5,376 KB
testcase_12 AC 2 ms
5,376 KB
testcase_13 AC 23 ms
11,008 KB
testcase_14 AC 30 ms
13,696 KB
testcase_15 AC 2 ms
5,376 KB
testcase_16 AC 2 ms
5,376 KB
testcase_17 AC 52 ms
20,736 KB
testcase_18 AC 7 ms
5,504 KB
testcase_19 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i32 = int32_t;
using i64 = int64_t;
#define rep(i,n) for(int i=0; i<(n); i++)


const i32 MOD = 998244353;

struct imod{
  i32 val;
  imod(i32 v=0){ val = v; }
  imod operator+(const imod& r) const {
    imod res;
    res.val =  (val + r.val) % MOD;
    return res;
  }
  imod operator*(const imod& r) const {
    imod res;
    res.val = (i64) val * r.val % MOD;
    return res;
  }
};


vector<i32> F, I, iF;
void initComb(int Z){
  F.assign(Z+1,1);
  for(int i=1; i<=Z; i++) F[i] = (i64)F[i-1] * i % MOD;
  I.assign(Z+1,1);
  for(int i=2; i<=Z; i++) I[i] = MOD - (i64)MOD / i * I[MOD % i] % MOD;
  iF.assign(Z+1,1);
  for(int i=1; i<=Z; i++) iF[i] = (i64)iF[i-1] * I[i] % MOD;
}
i64 Comb(int n, int r){
  return (i64)F[n] * iF[r] % MOD * iF[n-r] % MOD;
}


int N,M,K;


int main(){
  cin >> N >> M >> K;

  initComb(N+M+K);

  imod ans = 0;

  // o-o o-o o o o o
  if(N >= K-2 && M >= K && K >= 4 && N >= K-2 && M >= K)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K)
      * Comb(K-2,2)
      * F[K] * I[2] * I[2];
  // o=o o=o o o o o
  if(N >= K && M >= K-2 && K >= 4 && N >= K && M >= K-2)
  ans = ans + imod(Comb(N,K)) * Comb(M,K-2)
      * Comb(K-2,2)
      * F[K] * I[2] * I[2];

  cerr << ans.val << endl;

  // o-o-o o o o o o
  if(N >= K-2 && M >= K && K >= 3 && N >= K-2 && M >= K)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K)
      * Comb(K-2,1)
      * F[K] * I[2] * I[3];
  // o=o=o o o o o o
  if(N >= K && M >= K-2 && K >= 3 && N >= K && M >= K-2)
  ans = ans + imod(Comb(N,K)) * Comb(M,K-2)
      * Comb(K-2,1)
      * F[K] * I[2] * I[3];

  cerr << ans.val << endl;

  // o-o-o=o o o o o
  if(N >= K-2 && M >= K-1 && K >= 4 && N >= K-2 && M >= K-1)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-1)
      * Comb(K-2,1) * Comb(K-1,1)
      * (K-3) * F[K-2] * I[2];
  // o=o=o-o o o o o
  if(N >= K-1 && M >= K-2 && K >= 4 && N >= K-1 && M >= K-2)
  ans = ans + imod(Comb(N,K-1)) * Comb(M,K-2)
      * Comb(K-2,1) * Comb(K-1,1)
      * (K-3) * F[K-2] * I[2];

  cerr << ans.val << endl;

  // o-o=o o o o o
  //   |
  //   o=o
  if(N >= K-2 && M >= K-2 && K >= 5 && N >= K-2 && M >= K-2)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-2)
      * Comb(K-2,1) * Comb(K-2,2)
      * (K-3) * (K-4) * F[K-4];
  // o=o=o o o o o
  // | |
  // o o
  if(N >= K-2 && M >= K-2 && K >= 5 && N >= K-2 && M >= K-2)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-2)
      * Comb(K-2,1) * Comb(K-2,2)
      * (K-3) * (K-4) * F[K-4];

  cerr << ans.val << endl;

  // o-o o=o o o o o
  if(N >= K-1 && M >= K-1 && K >= 4 && N >= K-1 && M >= K-1)
  ans = ans + imod(Comb(N,K-1)) * Comb(M,K-1)
      * Comb(K-1,1) * Comb(K-1,1)
      * Comb(K-2,2) * F[K-2] * I[2];

  cerr << ans.val << endl;

  // o-o=o-o o o o o
  if(N >= K-2 && M >= K-1 && K >= 4 && N >= K-2 && M >= K-1)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-1)
      * Comb(K-2,2) * Comb(K-1,1)
      * F[K-2];
  // o=o-o=o o o o o
  if(N >= K-1 && M >= K-2 && K >= 4 && N >= K-1 && M >= K-2)
  ans = ans + imod(Comb(N,K-1)) * Comb(M,K-2)
      * Comb(K-2,2) * Comb(K-1,1)
      * F[K-2];

  cerr << ans.val << endl;

  // o=o o o o o
  // | |
  // o=o
  if(N >= K-2 && M >= K-2 && K >= 4 && N >= K-2 && M >= K-2)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-2)
      * Comb(K-2,2) * Comb(K-2,2)
      * F[K-4];

  cerr << ans.val << endl;

  // o-o=o-o=o o o o
  if(N >= K-2 && M >= K-2 && K >= 5 && N >= K-2 && M >= K-2)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-2)
      * Comb(K-2,2) * Comb(K-2,2)
      * 4 * (K-4) * F[K-4];

  cerr << ans.val << endl;

  // o-o=o o-o=o o o
  if(N >= K-2 && M >= K-2 && K >= 6 && N >= K-2 && M >= K-2)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-2)
      * Comb(K-2,2) * Comb(K-2,2)
      * 2 * (K-4) * (K-5) * F[K-4];

  cerr << ans.val << endl;

  // o-o o-o=o o o o
  if(N >= K-2 && M >= K-1 && K >= 5 && N >= K-2 && M >= K-1)
  ans = ans + imod(Comb(N,K-2)) * Comb(M,K-1)
      * Comb(K-2,2) * Comb(K-1,1)
      * 2 * (K-4) * F[K-2] * I[2];
  // o=o o-o=o o o o
  if(N >= K-1 && M >= K-2 && K >= 5 && N >= K-1 && M >= K-2)
  ans = ans + imod(Comb(N,K-1)) * Comb(M,K-2)
      * Comb(K-2,2) * Comb(K-1,1)
      * 2 * (K-4) * F[K-2] * I[2];

  cout << ans.val << "\n";

  return 0;
}




struct ios_do_not_sync{
  ios_do_not_sync(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
  }
} ios_do_not_sync_instance;




0