結果

問題 No.2048 L(I+D)S
ユーザー vjudge1vjudge1
提出日時 2024-12-30 16:23:06
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 57 ms / 2,000 ms
コード長 3,651 bytes
コンパイル時間 3,964 ms
コンパイル使用メモリ 249,192 KB
実行使用メモリ 5,632 KB
最終ジャッジ日時 2024-12-30 16:23:12
合計ジャッジ時間 4,826 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 4 ms
5,248 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 2 ms
5,248 KB
testcase_05 AC 2 ms
5,248 KB
testcase_06 AC 1 ms
5,248 KB
testcase_07 AC 2 ms
5,248 KB
testcase_08 AC 47 ms
5,248 KB
testcase_09 AC 19 ms
5,248 KB
testcase_10 AC 14 ms
5,248 KB
testcase_11 AC 54 ms
5,504 KB
testcase_12 AC 30 ms
5,248 KB
testcase_13 AC 18 ms
5,248 KB
testcase_14 AC 20 ms
5,248 KB
testcase_15 AC 8 ms
5,248 KB
testcase_16 AC 54 ms
5,376 KB
testcase_17 AC 56 ms
5,632 KB
testcase_18 AC 57 ms
5,632 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using i64 = long long;

template<class T>
T qmi(T a, i64 b) {
  T res = 1;
  for (; b; b /= 2, a *= a) {
    if (b % 2) {
      res *= a;
    }
  }
  return res;
}

i64 mul(i64 a, i64 b, i64 p) {
  i64 res = a * b - i64(1.L * a * b / p) * p;
  res %= p;
  if (res < 0) {
    res += p;
  }
  return res;
}

template<int P>
struct modint {
  int x;
  constexpr modint() : x{} {}
  constexpr modint(i64 x) : x{norm(x % getmod())} {}

  static int mod;
  constexpr static int getmod() {
    if (P > 0) {
      return P;
    } else {
      return mod;
    }
  }
  constexpr static void setmod(int m) {
    mod = m;
  }
  constexpr int norm(int x) const {
    if (x < 0) {
      x += getmod();
    }
    if (x >= getmod()) {
      x -= getmod();
    }
    return x;
  }
  constexpr int val() const {
    return x;
  }
  explicit constexpr operator int() const {
    return x;
  }
  constexpr modint operator-() const {
    modint res;
    res.x = norm(getmod() - x);
    return res;
  }
  constexpr modint inv() const {
    assert(x != 0);
    return qmi(*this, getmod() - 2);
  }
  constexpr modint &operator*= (modint v) & {
    x = 1LL * x * v.x % getmod();
    return *this;
  }
  constexpr modint &operator+= (modint v) & {
    x = norm(x + v.x);
    return *this;
  }
  constexpr modint &operator-= (modint v) & {
    x = norm(x - v.x);
    return *this;
  }
  constexpr modint &operator/= (modint v) & {
    return *this *= v.inv();
  }
  friend constexpr modint operator- (modint a, modint b) {
    modint res = a;
    res -= b;
    return res;
  }
  friend constexpr modint operator+ (modint a, modint b) {
    modint res = a;
    res += b;
    return res;
  }
  friend constexpr modint operator* (modint a, modint b) {
    modint res = a;
    res *= b;
    return res;
  }
  friend constexpr modint operator/ (modint a, modint b) {
    modint res = a;
    res /= b;
    return res;
  }
  friend constexpr std::istream &operator>> (std::istream& is, modint& a) {
    i64 v;
    is >> v;
    a = modint(v);
    return is;
  }
  friend constexpr std::ostream &operator<< (std::ostream& os, const modint& a) {
    return os << a.val();
  }
  friend constexpr bool operator== (modint a, modint b) {
    return a.val() == b.val();
  }
  friend constexpr bool operator!= (modint a, modint b) {
    return a.val() != b.val();
  }
};

constexpr int P = 998244353;
using mint = modint<P>;

struct Comb {
  int n;
  std::vector<mint> fact;
  std::vector<mint> invefact;
  std::vector<mint> inve;

  Comb() : n{0}, fact{1}, invefact{1}, inve{0} {}
  Comb(int n) : Comb() {
    init(n);
  }

  void init(int m) {
    if (m <= n) return;
    fact.resize(m + 1);
    invefact.resize(m + 1);
    inve.resize(m + 1);

    for (int i = n + 1; i <= m; i++) {
      fact[i] = fact[i - 1] * i;
    }
    invefact[m] = fact[m].inv();
    for (int i = m; i > n; i--) {
      invefact[i - 1] = invefact[i] * i;
      inve[i] = invefact[i] * fact[i - 1];
    }
    n = m;
  }

  mint fac(int m) {
    if (m > n) init(2 * m);
    return fact[m];
  }
  mint invfac(int m) {
    if (m > n) init(2 * m);
    return invefact[m];
  }
  mint inv(int m) {
    if (m > n) init(2 * m);
    return inve[m];
  }
  mint binom(int n, int m) {
    if (n < m || m < 0) return 0;
    return fac(n) * invfac(m) * invfac(n - m);
  }
} comb;

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n;
  std::cin >> n;

  mint ans = 0;
  for (int a = 2; a < n - 1; a++) {
    int b = n - a;
    mint c = comb.fac(n) * comb.invfac(a - 2) * comb.invfac(b - 2) / a / b / (n - 1);
    ans += c * c;
  }
  std::cout << ans << "\n";

  return 0;
}
0