39 lines
1.3 KiB
Python
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)
|