Initial
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user