提出 #31121531


ソースコード 拡げる

#include <cassert>
#include <iostream>
#include <vector>
using namespace std;
#include "atcoder/convolution.hpp"
#include "atcoder/modint.hpp"
using mint = atcoder::modint998244353;

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{100100};

mint calc1(long long H, long long W) {
  mint res = 0;
  for (int i = 0; i <= H; i++) {
    if (i % W == (H - i) % W) res += C(H, i);
  }
  return res * W;
}

mint calc2(long long H, long long W) {
  auto mul = [&](vector<mint>& a, vector<mint>& b) {
    auto c = atcoder::convolution(a, b);
    for (int i = W; i < (int)c.size(); i++) c[i % W] += c[i];
    c.resize(W);
    return c;
  };
  vector<mint> base(W), res(W);
  base[1] += 1, base[W - 1] += 1;
  res[0] = 1;
  while (H) {
    if (H & 1) res = mul(res, base);
    base = mul(base, base);
    H >>= 1;
  }
  return res[0] * W;
}

mint solve(long long H, long long W) {
  if (H % 2 == 0 and W % 2 == 0) return 2;
  if (H < W) swap(H, W);
  if (W % 2 == 0) swap(H, W);
  if (H <= 100000) return calc1(H, W);
  return calc2(H, W);
}

int main() {
  long long H, W;
  cin >> H >> W;
  cout << solve(H, W).val() << endl;
}

提出情報

提出日時
問題 E - Wazir
ユーザ Nyaan
言語 C++ (GCC 9.2.1)
得点 800
コード長 1638 Byte
結果 AC
実行時間 861 ms
メモリ 9420 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 800 / 800
結果
AC × 3
AC × 33
セット名 テストケース
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_min_00.txt, 01_min_01.txt, 01_min_02.txt, 02_small_00.txt, 02_small_01.txt, 02_small_02.txt, 02_small_03.txt, 02_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, 03_random_10.txt, 03_random_11.txt, 04_max_00.txt, 04_max_01.txt, 04_max_02.txt, 05_corner_00.txt, 05_corner_01.txt, 05_corner_02.txt, 05_corner_03.txt, 05_corner_04.txt, 05_corner_05.txt, 05_corner_06.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 9 ms 4164 KiB
00_sample_01.txt AC 5 ms 4132 KiB
00_sample_02.txt AC 73 ms 5080 KiB
01_min_00.txt AC 5 ms 3992 KiB
01_min_01.txt AC 5 ms 4540 KiB
01_min_02.txt AC 6 ms 3992 KiB
02_small_00.txt AC 4 ms 4056 KiB
02_small_01.txt AC 6 ms 4124 KiB
02_small_02.txt AC 5 ms 3988 KiB
02_small_03.txt AC 5 ms 4048 KiB
02_small_04.txt AC 5 ms 4168 KiB
03_random_00.txt AC 8 ms 4136 KiB
03_random_01.txt AC 5 ms 3992 KiB
03_random_02.txt AC 628 ms 9180 KiB
03_random_03.txt AC 664 ms 9256 KiB
03_random_04.txt AC 14 ms 3992 KiB
03_random_05.txt AC 6 ms 3992 KiB
03_random_06.txt AC 351 ms 6824 KiB
03_random_07.txt AC 334 ms 6832 KiB
03_random_08.txt AC 6 ms 4128 KiB
03_random_09.txt AC 8 ms 4608 KiB
03_random_10.txt AC 11 ms 4060 KiB
03_random_11.txt AC 7 ms 4608 KiB
04_max_00.txt AC 5 ms 4068 KiB
04_max_01.txt AC 596 ms 9420 KiB
04_max_02.txt AC 7 ms 4608 KiB
05_corner_00.txt AC 5 ms 4516 KiB
05_corner_01.txt AC 5 ms 4136 KiB
05_corner_02.txt AC 5 ms 4160 KiB
05_corner_03.txt AC 6 ms 4540 KiB
05_corner_04.txt AC 860 ms 9176 KiB
05_corner_05.txt AC 859 ms 9304 KiB
05_corner_06.txt AC 861 ms 9252 KiB