結果

問題 No.3037 トグルトグルトグル!
ユーザー lam6er
提出日時 2025-04-15 23:40:37
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 1,489 bytes
コンパイル時間 641 ms
コンパイル使用メモリ 81,920 KB
実行使用メモリ 64,896 KB
最終ジャッジ日時 2025-04-15 23:42:21
合計ジャッジ時間 1,626 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 3
other RE * 13
権限があれば一括ダウンロードができます

ソースコード

diff #

import operator as op

zero = len("")
one = len("x")
mod = op.add(op.pow(len(".........."), len(".........")), len("......."))

def multiply(a, b):
    a00 = a[zero][zero]
    a01 = a[zero][one]
    a10 = a[one][zero]
    a11 = a[one][one]
    b00 = b[zero][zero]
    b01 = b[zero][one]
    b10 = b[one][zero]
    b11 = b[one][one]
    c00 = op.mod(op.add(op.mul(a00, b00), op.mul(a01, b10)), mod)
    c01 = op.mod(op.add(op.mul(a00, b01), op.mul(a01, b11)), mod)
    c10 = op.mod(op.add(op.mul(a10, b00), op.mul(a11, b10)), mod)
    c11 = op.mod(op.add(op.mul(a10, b01), op.mul(a11, b11)), mod)
    return [[c00, c01], [c10, c11]]

def matrix_pow(mat, power):
    result = [[one, zero], [zero, one]]
    while op.gt(power, zero):
        if op.eq(op.mod(power, op.add(one, one)), one):
            result = multiply(result, mat)
        mat = multiply(mat, mat)
        power = op.floordiv(power, op.add(one, one))
    return result

def compute_lucas(n):
    if op.eq(n, zero):
        return op.mod(op.add(one, one), mod)
    elif op.eq(n, one):
        return op.mod(one, mod)
    else:
        exponent = op.add(n, ~zero)
        mat_pow = matrix_pow([[one, one], [one, zero]], exponent)
        L1 = one
        L0 = op.add(one, one)
        term1 = op.mul(mat_pow[zero][zero], L1)
        term2 = op.mul(mat_pow[zero][one], L0)
        l_n = op.add(term1, term2)
        return op.mod(l_n, mod)

T = int(input())
for _ in range(T):
    Ni = int(input())
    print(compute_lucas(Ni))
0