結果

問題 No.3006 ベイカーの問題
ユーザー kidodesu
提出日時 2025-01-17 22:50:34
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 63 ms / 2,000 ms
コード長 1,632 bytes
コンパイル時間 622 ms
コンパイル使用メモリ 82,124 KB
実行使用メモリ 62,208 KB
最終ジャッジ日時 2025-01-17 22:50:37
合計ジャッジ時間 2,722 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 24
権限があれば一括ダウンロードができます

ソースコード

diff #

mod = 998244353
def mat_mul(A, B, f = 1): #行列同士と行列ベクトルの積を計算
    n = len(A) 
    if f: #modの計算を行うか分岐
        global mod
        if isinstance(B[0], list): #行列同士の積か分岐
            C = [[0 for _ in range(n)] for _ in range(n)]
            for y in range(n):
                for x in range(n):
                    for d in range(n):
                        C[y][x] += A[y][d] * B[d][x] % mod
                        C[y][x] %= mod
            return C
        else:
            C = [0 for _ in range(n)]
            for y in range(n):
                for x in range(n):
                    C[y] += A[y][x] * B[x] % mod
                    C[y] %= mod
            return C
    else:
        if isinstance(B[0], list):
            C = [[0 for _ in range(n)] for _ in range(n)]
            for y in range(n):
                for x in range(n):
                    for d in range(n):
                        C[y][x] += A[y][d] * B[d][x]
            return C
        else:
            C = [0 for _ in range(n)]
            for y in range(n):
                for x in range(n):
                    C[y] += A[y][x] * B[x]
            return C

def pow_mat(M, B, n): #行列の累乗(M = 正規行列、 B = 遷移行列)
    while n:
        if n & 1:
            M = mat_mul(B, M)
        B = mat_mul(B, B)
        n >>= 1
    return M

x1, y1, n = map(int, input().split())

B = [[x1, -5*y1, 0, 0], [y1, x1, 0, 0], [1, 0, 1, 0], [0, 1, 0, 1]]

B = pow_mat([[1 if i == j else 0 for j in range(4)] for i in range(4)], B, n)


A = mat_mul(B, [x1, y1, 0, 0])

print(*A[2:])
0