結果
| 問題 |
No.1755 Almost Palindrome
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-11-20 15:57:50 |
| 言語 | Ruby (3.4.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,860 bytes |
| コンパイル時間 | 276 ms |
| コンパイル使用メモリ | 7,424 KB |
| 実行使用メモリ | 12,288 KB |
| 最終ジャッジ日時 | 2024-06-11 17:21:58 |
| 合計ジャッジ時間 | 1,209 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 1 |
| other | WA * 2 |
コンパイルメッセージ
Syntax OK
ソースコード
T = gets.to_i
MOD = 998244353
inv = ->n{ n.pow(MOD-2, MOD) }
B = 26
T.times do
n = gets.to_i
# print "#{n} -> "
if n == 1
puts 0
next
end
=begin
長さ l 、半径 r の回文のうち、中心に m 個同じ文字が連続するものを考える
中心に同じ文字が m 個連続するとは、回文の中央から片方の端まで m 個連続しているということ
長さ r の回文であって、中心に m 個同じ文字が連続するものは
- m = n のとき、 26 個ある
- すべて同じ文字なので、 26 通り
- m < n のとき、 26^(r - m) * 25 個ある
- r = 5, m = 2 のときは、 XYzAA ただし z は 25 文字(z != A)
- 26^(r - m - 1) * 25 * 26 = 26^(r - m) * 25
長さ r の回文であって、中心に m 個同じ文字が連続するものに、何か文字を挿入して回文でなくするには?
- 中央と異なる文字
- l が偶数のとき、中央以外に挿入できるので 25l 通り
- l が奇数のとき、どこにでも挿入できるので 25(l+1) 通り
- 中央と同じ文字
- m = r のとき、 何処にも挿入できない
- m < r のとき
- 中央に連続する文字の周辺には挿入できない m 文字連続するとき、
- l が偶数なら 実際は 2m 文字連続しているので 2m + 1 箇所つぶされる よって (l + 1) - (2m + 1) = l - 2m
- l が奇数なら 実際は 2m-1 文字連続しているので 2m 箇所つぶされる よって (l + 1) - 2m = l - 2m + 1
よって答えは
- l が偶数のとき、
- 中央と異なる文字を挿入する 26^r * 25l
- 中央と同じ文字を挿入する 26^(r - m) * 25 * (l - 2m)
- 合計で、 26^r * 25l + sum[m=1..r-1] 26^(r-m) * 25 * (l-2m)
- = 25l * 26^r + l(26^r - 26) - 52/25 * (-25r + 26^r - 1)
- # p26r = 26.pow(r, MOD)
- = 25 * l * p26r + l * (p26r - 26) - 52 * inv[25] * (-25 * r + p26r - 1)
- l が奇数のとき
- 中央と異なる文字を挿入する 26^r * 25(l+1)
- 中央と同じ文字を挿入する 26^(r - m) * 25 * (l - 2m + 1)
- 合計で、 26^r * 25(l + 1) + sum[m=1..r-1] 26^(r - m) * 25 * (l - 2m + 1)
- = l(26^r - 26) + 25(l + 1) * 26^r + 1/25 * (-27 * 26^r - 598) + 52r
- = l * (p26r - 26) + 25 * (l + 1) * p26r + inv[25] * (-27 * p26r - 598) + 52 * r
=end
l = n - 1 # 回文の長さ
r = (l + 1) / 2 # 回文の半径
p26r = B.pow(r, MOD)
if l.even?
ans = (B - 1) * l * p26r + l * (p26r - B) - 2 * B * inv[B - 1] * (-(B - 1) * r + p26r - 1)
ans %= MOD
puts ans
else
ans = l * (p26r - B) + (B - 1) * (l + 1) * p26r + inv[B - 1] * (-(B + 1) * p26r - B * (B - 3)) + 2 * B * r
# ans = (B - 1) * l * p26r + l * (p26r - B) - 2 * B * inv[B - 1] * (-(B - 1) * r + p26r - 1)
ans %= MOD
puts ans
end
end