結果
問題 | No.1352 Three Coins |
ユーザー |
👑 |
提出日時 | 2022-09-27 23:16:09 |
言語 | Lua (LuaJit 2.1.1734355927) |
結果 |
AC
|
実行時間 | 6 ms / 2,000 ms |
コード長 | 2,560 bytes |
コンパイル時間 | 157 ms |
コンパイル使用メモリ | 6,820 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-22 17:16:39 |
合計ジャッジ時間 | 1,449 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 34 |
ソースコード
local mfl, mce = math.floor, math.ceillocal mmi, mma = math.min, math.maxlocal pow2 = {1}for i = 2, 28 do pow2[i] = pow2[i - 1] * 2 endlocal SegTree = {}SegTree.updateAll = function(self)for i = self.stagenum - 1, 1, -1 dolocal cnt = pow2[i]for j = 0, cnt - 1 doself.stage[cnt + j] = self.func(self.stage[(cnt + j) * 2], self.stage[(cnt + j) * 2 + 1])endendendSegTree.create = function(self, n, func, emptyvalue)self.func, self.emptyvalue = func, emptyvaluelocal stagenum, mul = 1, 1self.stage = {} -- use 1D Tree (stage[], not stage[][])while mul < n domul, stagenum = mul * 2, stagenum + 1endself.stagenum = stagenumfor i = 1, mul * 2 - 1 do self.stage[i] = emptyvalue endfor i = 1, n do self.stage[mul + i - 1] = i endself:updateAll()endSegTree.update = function(self, idx, force)idx = idx + pow2[self.stagenum] - 1for i = self.stagenum - 1, 1, -1 dolocal dst = mfl(idx / 2)local rem = dst * 4 + 1 - idxself.stage[dst] = self.func(self.stage[idx], self.stage[rem])if not force and self.stage[dst] ~= self.stage[idx] then break endidx = dstendendSegTree.new = function(n, func, emptyvalue)local obj = {}setmetatable(obj, {__index = SegTree})obj:create(n, func, emptyvalue)return objendlocal n, b, c = io.read("*n", "*n", "*n")local function getgcd(x, y)while 0 < x dox, y = y % x, xendreturn yendif 1 < getgcd(n, getgcd(b, c)) thenprint("INF")os.exit()endlocal inf = 1000000007*1000local len = {}local asked = {}for i = 1, n dolen[i] = infasked[i] = falseenddolocal z = b % nif z == 0 then z = n endlen[z] = bz = c % nif z == 0 then z = n endif c < len[z] thenlen[z] = cendendif n < len[n] then len[n] = n endasked[n + 1] = truelocal function mergefunc(x, y)if asked[x] then return yelseif asked[y] then return xelsereturn len[x] < len[y] and x or yendendlocal st = SegTree.new(n, mergefunc, n + 1)for i = 1, n dolocal src = st.stage[1]if asked[src] then break endif inf <= len[src] then break endasked[src] = truest:update(src, true)local dst = (src + b) % nif dst == 0 then dst = n endif len[src] + b < len[dst] thenlen[dst] = len[src] + bst:update(dst)enddst = (src + c) % nif dst == 0 then dst = n endif len[src] + c < len[dst] thenlen[dst] = len[src] + cst:update(dst)endendlocal ret = -1for i = 1, n do-- print(i, len[i])ret = ret + math.floor(len[i] / n)endprint(ret)