Files
exercises/luogu_ez_P16681_dp.py
T
2026-07-23 14:22:17 +08:00

39 lines
1.3 KiB
Python

import itertools
import sys
from typing import Literal
ROW_COUNT = 341_799
MOD = 998_244_353
PatternCharType = Literal[0, 1]
def get_pattern_multiplier(pattern: tuple[PatternCharType, PatternCharType, PatternCharType]) -> int:
match pattern:
case (0, 0, 0) | (0, 0, 1) | (1, 0, 0) | (0, 1, 0) | (1, 0, 1): return 21 * 21
case (0, 1, 1) | (1, 1, 0): return 21 * 26
case (1, 1, 1): return 26 * 26
case _: raise ValueError(f"Unknown pattern: {pattern}")
dp: dict[PatternCharType, list[tuple[int, int]]] = {0: [(-1, -1), (5, 0)], 1: [(-1, -1), (0, 21)]}
for _ in range(ROW_COUNT - 1):
for c in 0, 1:
dp[c].append((dp[c][-1][1] * 5 % MOD, (dp[c][-1][0] + dp[c][-1][1]) * 21 % MOD))
answer = 0
for pattern1 in itertools.product([0, 1], repeat=3):
for pattern2 in itertools.product([0, 1], repeat=3):
# noinspection PyTypeChecker
answer += dp[pattern1[0]][ROW_COUNT][pattern2[0]] \
* dp[pattern1[1]][ROW_COUNT][pattern2[1]] \
* dp[pattern1[2]][ROW_COUNT][pattern2[2]] \
* get_pattern_multiplier(pattern1) \
* get_pattern_multiplier(pattern2) \
% MOD
print(dp[0][:100], dp[1][:100], file=sys.stderr, sep="\n")
print(answer % MOD)