結果

問題 No.1569 Nixoracci's Number
ユーザー 👑 obakyanobakyan
提出日時 2021-08-10 19:58:21
言語 Lua
(LuaJit 2.1.1696795921)
結果
TLE  
実行時間 -
コード長 1,854 bytes
コンパイル時間 195 ms
コンパイル使用メモリ 6,948 KB
実行使用メモリ 13,756 KB
最終ジャッジ日時 2024-09-22 22:09:11
合計ジャッジ時間 6,819 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,756 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 AC 4 ms
6,940 KB
testcase_04 TLE -
testcase_05 AC 192 ms
6,944 KB
testcase_06 TLE -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

local mfl, mce = math.floor, math.ceil
local function badd(a, b) return (a + b) % 2 end
local function bmul(a, b) return a * b end

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 n, k = io.read():match("(%d+) (%d+)")
n = tonumber(n)
local strk = k
k = lltonumber(k)
local str = io.read()
local dlim = 60

local mat = {}
for i = 1, n - 1 do
  mat[i] = {}
  for j = 1, n do
    mat[i][j] = 1 + i == j and 1 or 0
  end
end
mat[n] = {}
for j = 1, n do mat[n][j] = 1 end
local vec = {}
for i = 1, dlim do vec[i] = {} end
local a = {}
do
  local i = 0
  for w in str:gmatch("%d+") do
    i = i + 1
    w = lltonumber(w)
    a[i] = w
    assert(w <= 1000000000000000000LL)
    for j = 1, dlim do
      vec[j][i] = w % 2LL == 0 and 0 or 1
      w = w / 2LL
    end
  end
end
if #strk <= 3 then
  local tk = tonumber(strk)
  if tk <= n then
    print(a[tk])
    os.exit()
  end
end
k = k - n

local tmpmat = {}
for i = 1, n do
  tmpmat[i] = {}
end
local tmpvec = {}

local function matmat()
  for i = 1, n do
    for j = 1, n do
      local v = 0
      for k = 1, n do
        v = badd(v, bmul(mat[i][k], mat[k][j]))
      end
      tmpmat[i][j] = v
    end
  end
  for i = 1, n do for j = 1, n do
    mat[i][j] = tmpmat[i][j]
  end end
end
local function matvec()
  for d = 1, dlim do
    for i = 1, n do
      local v = 0
      for k = 1, n do
        v = badd(v, bmul(mat[i][k], vec[d][k]))
      end
      tmpvec[i] = v
    end
    for i = 1, n do
      vec[d][i] = tmpvec[i]
    end
  end
end
while 0LL < k do
  if k % 2LL == 1LL then
    matvec()
  end
  matmat()
  k = k / 2LL
end
local ret = 0LL
local mul = 1LL
for i = 1, dlim do
  if vec[i][n] == 1 then
    ret = ret + mul
  end
  mul = mul + mul
end
ret = tostring(ret):gsub("LL", "")
print(ret)
0