結果
| 問題 |
No.1492 01文字列と転倒
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2022-01-02 00:06:46 |
| 言語 | Lua (LuaJit 2.1.1734355927) |
| 結果 |
AC
|
| 実行時間 | 878 ms / 4,000 ms |
| コード長 | 1,498 bytes |
| コンパイル時間 | 93 ms |
| コンパイル使用メモリ | 6,816 KB |
| 実行使用メモリ | 29,440 KB |
| 最終ジャッジ日時 | 2024-10-10 18:04:11 |
| 合計ジャッジ時間 | 8,059 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 22 |
ソースコード
local mmi, mma = math.min, math.max
local mfl, mce = math.floor, math.ceil
local n, mod = io.read("*n", "*n")
local function badd(x, y) return (x + y) % mod end
-- dp[0-stack+1][inv_count+1]
local dp1, dp2 = {}, {}
dp1[1] = {1}
for i = 2, n * n + 1 do dp1[1][i] = 0 end
for i = 1, n * 2 do
local src = i % 2 == 1 and dp1 or dp2
local dst = i % 2 == 1 and dp2 or dp1
local zero_max = mmi(n, i)
for j = #dst + 1, zero_max + 1 do
dst[j] = {}
end
local z = mma(0, mfl((i - 1) / 2))
local inv_lim = mfl(z * (z + 1) / 2)
z = mma(0, mfl((i - 2) / 2))
local src_inv_lim = mfl(z * (z + 1) / 2)
inv_lim, src_inv_lim = n * n, n * n
for j = 1, zero_max + 1 do
local dj = dst[j]
for k = 1, 1 + inv_lim do
dj[k] = 0
end
end
local src_zero_max = mmi(n, i - 1)
for j = 1, src_zero_max + 1 do
local sj = src[j]
local rem_zeros = j - 1
local used_ones = mma(0, mfl((i - 1 - rem_zeros) / 2))
if 0 < rem_zeros then
local dj = dst[j - 1]
for k = 1, src_inv_lim + 1 do
dj[k] = badd(dj[k], sj[k])
end
end
if rem_zeros < n then
local dj = dst[j + 1]
for k = 1, src_inv_lim + 1 do
if not dj[k + used_ones] then break end
dj[k + used_ones] = badd(dj[k + used_ones], sj[k])
end
end
end
-- print("---")
-- for j = 1, #dst do
-- print(table.concat(dst[j], " "))
-- end
end
local tbl = dp1
print(table.concat(tbl[1], "\n"))
-- io.write(string.rep("0\n", n * n + 1 - #tbl[1]))