結果
| 問題 |
No.1036 Make One With GCD 2
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2021-08-02 22:43:21 |
| 言語 | Lua (LuaJit 2.1.1734355927) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,492 bytes |
| コンパイル時間 | 156 ms |
| コンパイル使用メモリ | 5,376 KB |
| 実行使用メモリ | 91,960 KB |
| 最終ジャッジ日時 | 2024-09-16 14:48:07 |
| 合計ジャッジ時間 | 14,236 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 TLE * 9 |
ソースコード
local ffi = require("ffi")
local C = ffi.C
ffi.cdef[[
long long atoll(const char*);
]]
local function lltonumber(str)
return C.atoll(str)
end
local function getgcd(x, y)
while 0LL < x do
x, y = y % x, x
end
return y
end
local n = io.read("*n", "*l")
local a = {}
local str = io.read()
local I = 0
for w in str:gmatch("%d+") do
I = I + 1
a[I] = lltonumber(w)
end
a[n + 1] = 1LL
local suf_spos = 0
local pre_sum, suf_sum = {}, {}
local pre_idx_len, suf_len = 0, 0
local function push(idx)
suf_len = suf_len + 1
if suf_len == 1 then
suf_spos = idx
suf_sum[suf_len] = a[idx]
else
suf_sum[suf_len] = getgcd(suf_sum[suf_len - 1], a[idx])
end
end
local function pop()
if pre_idx_len == 0 then
pre_sum[1] = a[suf_spos + suf_len - 1]
for i = 2, suf_len - 1 do
pre_sum[i] = getgcd(pre_sum[i - 1], a[suf_spos + suf_len - i])
end
pre_idx_len = suf_len - 1
suf_len = 0
else
pre_idx_len = pre_idx_len - 1
end
end
local function query()
if pre_idx_len == 0 then
return suf_sum[suf_len]
elseif suf_len == 0 then
return pre_sum[pre_idx_len]
else
return getgcd(suf_sum[suf_len], pre_sum[pre_idx_len])
end
end
local ret = 0
local cur = a[1]
local right = 1
push(1)
for i = 1, n do
if right < i then
push(i)
right = i
cur = a[i]
end
cur = query()
while 1LL < cur do
right = right + 1
push(right)
cur = getgcd(cur, a[right])
end
ret = ret + n + 1 - right
pop()
end
print(ret)