提出 #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;
}
提出情報
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 800 / 800 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |