提出 #31644007


ソースコード 拡げる

#include <iostream>
#include <utility>
#include <vector>
using namespace std;

#include "atcoder/modint.hpp"
using mint = atcoder::static_modint<7>;
struct Binomial {
  vector<mint> fac, invfac, inv;
  Binomial(int n) : fac(n + 1), invfac(n + 1), inv(n + 1) {
    fac[0] = invfac[0] = inv[0] = 1;
    for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i;
    invfac[n] = fac[n].inv();
    for (int i = n - 1; i >= 0; i--) {
      invfac[i] = invfac[i + 1] * (i + 1);
      inv[i + 1] = invfac[i + 1] * fac[i];
    }
  }
  mint operator()(int n, int r) {
    if (n < 0 || r < 0 || n < r) return 0;
    return fac[n] * invfac[n - r] * invfac[r];
  }
} C{6};

constexpr int p = 7;

// return binom(n, r)
mint binom(int n, int r) {
  if (n < 0 or r < 0 or n < r) return 0;
  if (n < p) return C(n, r);
  mint res = 1;
  while (n) {
    if (n % p < r % p) return 0;
    res *= C(n % p, r % p);
    n = n / p, r = r / p;
  }
  return res;
}

// return ( {sum_{r=0...R-1} binom(N, r)}, binom(N, R) )
pair<mint, mint> binom_acc(int n, int R) {
  if (R <= 0) return {0, (R == 0 ? 1 : 0) % p};
  auto [sum, bin] = binom_acc(n / p, R / p);
  sum *= (1 << (n % p));
  for (int r = R / p * p; r < R; r++) sum += bin * binom(n % p, r % p);
  bin *= binom(n % p, R % p);
  return {sum, bin};
}

// enumerate (binom(n, l), ..., binom(n, r) )
vector<mint> binom_enum(int n, int l, int r) {
  if (l == r) return {binom(n, r)};
  auto par = binom_enum(n / p, l / p, r / p);
  int nr = n % p, lr = l % p, lq = l / p;
  vector<mint> res(r - l + 1);
  for (int i = l, ir = lr, iq = lq; i <= r; i++, ir++) {
    if (ir == 7) ir = 0, iq++;
    res[i - l] = par[iq - lq] * binom(nr, ir);
  }
  return res;
}

int main() {
  int N, M, K;
  vector<pair<int, int>> ac;

  cin >> N >> M >> K;
  ac.resize(M);
  for (auto &[a, c] : ac) cin >> a >> c;
  for (int i = 1; i < M; i++) {
    (ac[i - 1].first += p - ac[i].first) %= p;
    ac[i].second += ac[i - 1].second;
  }
  vector<mint> B(K + 1);
  for (auto &[a, c] : ac) {
    int upper = min(N - K, c - 1);
    mint bin = binom_acc(N - K, upper + 1).first;
    int lower = max(0, upper - K);
    auto diff = binom_enum(N - K, lower, upper);
    for (int s = 1; s <= K; s++) {
      int cur_upper = min(N - K, c - s);
      if (cur_upper < upper) {
        if (upper >= 0) {
          bin -= diff.back();
          diff.pop_back();
        }
        upper--;
      }
      B[s] += a * bin;
    }
  }
  for (int i = 1; i <= K; i++) {
    cout << B[i].val() << " \n"[i == K];
  }
}

提出情報

提出日時
問題 Ex - Fill Triangle
ユーザ Nyaan
言語 C++ (GCC 9.2.1)
得点 600
コード長 2597 Byte
結果 AC
実行時間 1199 ms
メモリ 7524 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 3
AC × 49
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 01_small_06.txt, 01_small_07.txt, 01_small_08.txt, 01_small_09.txt, 02_k_small_00.txt, 02_k_small_01.txt, 02_k_small_02.txt, 02_k_small_03.txt, 02_k_small_04.txt, 03_random_00.txt, 03_random_01.txt, 03_random_02.txt, 03_random_03.txt, 03_random_04.txt, 03_random_05.txt, 03_random_06.txt, 03_random_07.txt, 03_random_08.txt, 03_random_09.txt, 04_max_7_00.txt, 04_max_7_01.txt, 04_max_7_02.txt, 04_max_7_03.txt, 04_max_7_04.txt, 04_max_7_05.txt, 04_max_7_06.txt, 04_max_7_07.txt, 04_max_7_08.txt, 05_sparse_inc_00.txt, 05_sparse_inc_01.txt, 05_sparse_inc_02.txt, 06_sparse_dec_00.txt, 06_sparse_dec_01.txt, 06_sparse_dec_02.txt, 07_sparse_random_00.txt, 07_sparse_random_01.txt, 07_sparse_random_02.txt, 07_sparse_random_03.txt, 07_sparse_random_04.txt, 07_sparse_random_05.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 8 ms 3576 KiB
00_sample_01.txt AC 2 ms 3420 KiB
00_sample_02.txt AC 2 ms 3452 KiB
01_small_00.txt AC 2 ms 3424 KiB
01_small_01.txt AC 2 ms 3420 KiB
01_small_02.txt AC 2 ms 3644 KiB
01_small_03.txt AC 4 ms 3640 KiB
01_small_04.txt AC 3 ms 3444 KiB
01_small_05.txt AC 2 ms 3580 KiB
01_small_06.txt AC 2 ms 3504 KiB
01_small_07.txt AC 2 ms 3552 KiB
01_small_08.txt AC 2 ms 3608 KiB
01_small_09.txt AC 2 ms 3644 KiB
02_k_small_00.txt AC 4 ms 3580 KiB
02_k_small_01.txt AC 32 ms 3492 KiB
02_k_small_02.txt AC 30 ms 3528 KiB
02_k_small_03.txt AC 18 ms 3664 KiB
02_k_small_04.txt AC 5 ms 3648 KiB
03_random_00.txt AC 927 ms 7432 KiB
03_random_01.txt AC 4 ms 3432 KiB
03_random_02.txt AC 296 ms 6612 KiB
03_random_03.txt AC 219 ms 5380 KiB
03_random_04.txt AC 21 ms 3860 KiB
03_random_05.txt AC 704 ms 7424 KiB
03_random_06.txt AC 7 ms 3652 KiB
03_random_07.txt AC 215 ms 4900 KiB
03_random_08.txt AC 182 ms 6544 KiB
03_random_09.txt AC 400 ms 5764 KiB
04_max_7_00.txt AC 1199 ms 7464 KiB
04_max_7_01.txt AC 5 ms 3452 KiB
04_max_7_02.txt AC 1155 ms 7228 KiB
04_max_7_03.txt AC 1198 ms 7524 KiB
04_max_7_04.txt AC 5 ms 3508 KiB
04_max_7_05.txt AC 311 ms 4492 KiB
04_max_7_06.txt AC 1198 ms 7412 KiB
04_max_7_07.txt AC 5 ms 3532 KiB
04_max_7_08.txt AC 500 ms 5128 KiB
05_sparse_inc_00.txt AC 463 ms 7376 KiB
05_sparse_inc_01.txt AC 5 ms 3480 KiB
05_sparse_inc_02.txt AC 435 ms 7392 KiB
06_sparse_dec_00.txt AC 1141 ms 7360 KiB
06_sparse_dec_01.txt AC 8 ms 3584 KiB
06_sparse_dec_02.txt AC 386 ms 4648 KiB
07_sparse_random_00.txt AC 1171 ms 7468 KiB
07_sparse_random_01.txt AC 5 ms 3428 KiB
07_sparse_random_02.txt AC 152 ms 3780 KiB
07_sparse_random_03.txt AC 1198 ms 7416 KiB
07_sparse_random_04.txt AC 5 ms 3532 KiB
07_sparse_random_05.txt AC 217 ms 3956 KiB