結果
| 問題 |
No.1105 Many Triplets
|
| コンテスト | |
| ユーザー |
toyuzuko
|
| 提出日時 | 2020-07-04 22:52:32 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 32 ms / 2,000 ms |
| コード長 | 2,334 bytes |
| コンパイル時間 | 626 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 11,008 KB |
| 最終ジャッジ日時 | 2024-09-19 14:45:52 |
| 合計ジャッジ時間 | 2,038 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
class SquareMatrix():
def __init__(self, n, mod=1000000007):
self.n = n
self.mat = [[0 for j in range(n)] for i in range(n)]
self.mod = mod
@staticmethod
def id(n):
res = SquareMatrix(n)
for i in range(n):
res.mat[i][i] = 1
return res
def operate(self, vec):
assert len(vec) == self.n
res = [0 for _ in range(self.n)]
for i in range(self.n):
for j in range(self.n):
res[i] += self.mat[i][j] * vec[j]
res[i] %= self.mod
return res
def add(self, other):
assert other.n == self.n
res = SquareMatrix(self.n)
for i in range(self.n):
for j in range(self.n):
res.mat[i][j] = self.mat[i][j] + other.mat[i][j]
res.mat[i][j] %= self.mod
return res
def subtract(self, other):
assert other.n == self.n
res = SquareMatrix(self.n)
for i in range(self.n):
for j in range(self.n):
res.mat[i][j] = self.mat[i][j] - other.mat[i][j]
res.mat[i][j] %= self.mod
return res
def times(self, k):
res = SquareMatrix(self.n)
for i in range(self.n):
for j in range(self.n):
res.mat[i][j] = self.mat[i][j] * k
res.mat[i][j] %= self.mod
return res
def multiply(self, other): #O(n^3)
assert self.n == other.n
res = SquareMatrix(self.n)
for i in range(self.n):
for j in range(self.n):
for k in range(self.n):
res.mat[i][j] += self.mat[i][k] * other.mat[k][j]
res.mat[i][j] %= self.mod
return res
def power(self, k):
tmp = SquareMatrix(self.n)
for i in range(self.n):
for j in range(self.n):
tmp.mat[i][j] = self.mat[i][j]
res = SquareMatrix.id(self.n)
while k:
if k & 1:
res = res.multiply(tmp)
tmp = tmp.multiply(tmp)
k >>= 1
return res
N = int(input())
A = list(map(int, input().split()))
M = SquareMatrix(3)
for i in range(3):
M.mat[i][i] = 1
M.mat[i][i - 1] = 0
M.mat[i][i - 2] = -1
res = M.power(N - 1).operate(A)
print(*res)
toyuzuko