結果

問題 No.1755 Almost Palindrome
ユーザー 👑 SPD_9X2SPD_9X2
提出日時 2021-11-20 15:25:29
言語 PyPy3
(7.3.13)
結果
AC  
実行時間 159 ms / 2,000 ms
コード長 1,472 bytes
コンパイル時間 1,049 ms
コンパイル使用メモリ 86,872 KB
実行使用メモリ 108,312 KB
最終ジャッジ日時 2023-09-02 09:56:24
合計ジャッジ時間 1,565 ms
ジャッジサーバーID
(参考情報)
judge15 / judge14
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 107 ms
99,444 KB
testcase_01 AC 107 ms
99,604 KB
testcase_02 AC 159 ms
108,312 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

"""

4箇所が重要

 AB  CD

A,D が対応している。
B,C も対応している。

消した外側は影響を受けない
→異なるペアの内、もっとも外側を一つ消す必要がある。

左を消すと行ける場合
右を消すといける場合
どっちを消しても行ける場合

を場合分けして包除原理すればよい

偶数文字の場合、
XYXYXY
みたいな場合だとどっちを消しても行ける。

奇数文字の場合
全部同じ必要がある→どっちを消しても~はありえない

消す部分を 回文コア と呼ぶことにしよう。

長さ kの回文の個数は  A[k] = 26 ^ ( (k+1)//2 )
長さkの回文コアの数は
if k % 2 == 0 :
    B[k] = 2 * (A[k-1] * 25) - 26*25
else:
    B[k] = 2 * (A[k-1] * 25)

長さNのほぼ回文の個数は
Bに26^? をしていけばよろし

"""

import sys
from sys import stdin

mod = 998244353

A = [0] * (10**6+1)
A[1] = 26
for i in range(2,len(A)):
    if i % 2 == 0:
        A[i] = A[i-1]
    else:
        A[i] = A[i-1] * 26 % mod

B = [0] * (10**6+1)

for k in range(2,len(B)):

    if k % 2 == 0:
        B[k] = ( 2 * (A[k-1] * 25) - 26 * 25 ) % mod
    else:
        B[k] = ( 2 * (A[k-1] * 25) ) % mod

C = [0] * (10**6+1)
for k in range(2,len(B)):

    C[k] = (C[k-2] * 26 + B[k]) % mod

TT = int(stdin.readline())

mod = 998244353
ANS = []
for loop in range(TT):
    ANS.append( str(C[int(stdin.readline())]) )
print ("\n".join(ANS))
0