classMatrix: def__init__(self, mat): self.mat = mat
def__mul__(self, other): assertlen(self.mat[0]) == len(other.mat) return Matrix([[sum(x * y for x, y inzip(row, col)) % MOD for col inzip(*other.mat)] for row in self.mat]) def__pow__(self, k): assertlen(self.mat) == len(self.mat[0]) n = len(self.mat) res = Matrix([[int(i == j) for j inrange(n)] for i inrange(n)]) base = self while k > 0: if k & 1: res *= base base *= base k >>= 1 return res defmul_pow(self, k, x): assertlen(self.mat[0]) == len(x.mat) res = x base = self while k > 0: if k & 1: res = base * res base *= base k >>= 1 return res def__getitem__(self, i): return self.mat[i]
classSolution: defzigZagArrays(self, n: int, l: int, r: int) -> int: V = r - l + 1# [l, r] => [0, V - 1] f = Matrix([[1] for _ inrange(V * 2)]) M = [[0] * (V * 2) for _ inrange(V * 2)] for i inrange(V): for j inrange(V, V + i): M[i][j] = 1 for j inrange(i + 1, V): M[i + V][j] = 1 M = Matrix(M) f = M.mul_pow(n - 1, f) returnsum(map(sum, f.mat)) % MOD
defmatrix_power_mul(A: np.ndarray, n: int, x: np.ndarray, mod: int): assertlen(A[0]) == len(x) res = x while n > 0: if n & 1: res = A @ res % mod A = A @ A % mod n >>= 1 return res
classSolution: defzigZagArrays(self, n: int, l: int, r: int) -> int: V = r - l + 1# [l, r] => [0, V - 1] f = np.ones((V * 2, 1), dtype=np.object_) M = np.zeros((V * 2, V * 2), dtype=np.object_) for i inrange(V): for j inrange(V, V + i): M[i][j] = 1 for j inrange(i + 1, V): M[i + V][j] = 1 f = matrix_power_mul(M, n - 1, f, MOD) returnint(np.sum(f) % MOD)
classMatrix: def__init__(self, mat): self.mat = mat
def__mul__(self, other): assertlen(self.mat[0]) == len(other.mat) return Matrix([[sum(x * y for x, y inzip(row, col)) % MOD for col inzip(*other.mat)] for row in self.mat]) def__pow__(self, k): assertlen(self.mat) == len(self.mat[0]) n = len(self.mat) res = Matrix([[int(i == j) for j inrange(n)] for i inrange(n)]) base = self while k > 0: if k & 1: res *= base base *= base k >>= 1 return res defmul_pow(self, k, x): assertlen(self.mat[0]) == len(x.mat) res = x base = self while k > 0: if k & 1: res = base * res base *= base k >>= 1 return res def__getitem__(self, i): return self.mat[i]
classSolution: defzigZagArrays(self, n: int, l: int, r: int) -> int: V = r - l + 1# [l, r] => [0, V - 1] f = Matrix([[1] for _ inrange(V)]) M = [[0] * V for _ inrange(V)] for i inrange(V): for j inrange(V - i - 1): M[i][j] = 1 M = Matrix(M) f = M.mul_pow(n - 1, f) returnsum(map(sum, f.mat)) * 2 % MOD
defmatrix_power_mul(A: np.ndarray, n: int, x: np.ndarray, mod: int): assertlen(A[0]) == len(x) res = x while n > 0: if n & 1: res = A @ res % mod A = A @ A % mod n >>= 1 return res
classSolution: defzigZagArrays(self, n: int, l: int, r: int) -> int: V = r - l + 1# [l, r] => [0, V - 1] f = np.ones((V, 1), dtype=np.object_) M = np.tril(np.ones((V, V), dtype=np.object_)[::-1], k=-1)[::-1] f = matrix_power_mul(M, n - 1, f, MOD) returnint(np.sum(f) * 2 % MOD)