Submission #65693279


Source Code Expand

# 高速なの O(N)
from itertools import permutations


class Binominal:
    def __init__(self, N, mod) -> None:
        fact = [1, 1]
        factinv = [1, 1]
        inv = [0, 1]

        for i in range(2, N + 1):
            fact.append((fact[-1] * i) % mod)
            inv.append((-inv[mod % i] * (mod // i)) % mod)
            factinv.append((factinv[-1] * inv[-1]) % mod)

        self.fact = fact
        self.factinv = factinv
        self.inv = inv
        self.mod = mod
        self.N = N

    def nPr(self, n, r):
        if r < 0 or n < r:
            return 0
        return self.fact[n] * self.factinv[n - r] % self.mod

    def nCr(self, n, r):
        if r < 0 or n < r:
            return 0
        r = min(r, n - r)
        return (
            self.fact[n] * self.factinv[r] % self.mod * self.factinv[n - r] % self.mod
        )


MOD = 998244353


def main():
    A, B, C, D = map(int, input().split())

    ans = solve(A, B, C, D)
    print(ans)


def solve(A, B, C, D):
    bn = Binominal(A + B + C + D, MOD)
    ans = 0
    for b in range(B + 1):
        ans += bn.nCr(A + b - 1, b) * bn.nCr(B - b + C + D, C) % MOD
        ans %= MOD
    return ans


def naive(A, B, C, D):
    ans = 0
    cand = list("a" * A) + list("b" * B) + list("c" * C) + list("d" * D)
    seen = set()
    for pat in permutations(cand):
        s = "".join(pat)
        if s.rindex("a") > s.index("d"):
            continue
        if s.rindex("a") > s.index("c"):
            continue
        if s.rindex("b") > s.index("d"):
            continue
        seen.add(s)
    print(*seen, sep="\n")
    return len(seen)


def test():

    print(solve(2, 1, 1, 1), naive(2, 1, 1, 1))
    print(solve(1, 1, 1, 2), naive(1, 1, 1, 2))
    print(naive(1, 1, 1, 1))


# test()
main()


"""
補集合を考えた方が楽そう?

制約がないパターン数
(ABCD)C(A) (BCD)C(B) (CD)C(C)

"""

Submission Info

Submission Time
Task E - Fruit Lineup
User mo12412
Language Python (PyPy 3.10-v7.3.12)
Score 475
Code Size 1979 Byte
Status AC
Exec Time 721 ms
Memory 307616 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 3
AC × 17
Set Name Test Cases
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_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 02_max_00.txt, 02_max_01.txt, 02_max_02.txt, 02_max_03.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 55 ms 76472 KiB
00_sample_01.txt AC 56 ms 76516 KiB
00_sample_02.txt AC 426 ms 299656 KiB
01_random_00.txt AC 432 ms 299784 KiB
01_random_01.txt AC 453 ms 299552 KiB
01_random_02.txt AC 401 ms 299660 KiB
01_random_03.txt AC 203 ms 286640 KiB
01_random_04.txt AC 308 ms 295824 KiB
01_random_05.txt AC 614 ms 307132 KiB
01_random_06.txt AC 413 ms 299760 KiB
01_random_07.txt AC 265 ms 295916 KiB
01_random_08.txt AC 261 ms 295944 KiB
01_random_09.txt AC 309 ms 296064 KiB
02_max_00.txt AC 693 ms 307388 KiB
02_max_01.txt AC 721 ms 307500 KiB
02_max_02.txt AC 710 ms 307328 KiB
02_max_03.txt AC 707 ms 307616 KiB