結果
問題 | No.2156 ぞい文字列 |
ユーザー | MasKoaTS |
提出日時 | 2022-12-09 21:52:53 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 170 ms / 2,000 ms |
コード長 | 4,800 bytes |
コンパイル時間 | 261 ms |
コンパイル使用メモリ | 82,340 KB |
実行使用メモリ | 89,728 KB |
最終ジャッジ日時 | 2024-10-14 21:42:42 |
合計ジャッジ時間 | 4,503 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 165 ms
89,728 KB |
testcase_01 | AC | 169 ms
89,344 KB |
testcase_02 | AC | 163 ms
89,472 KB |
testcase_03 | AC | 165 ms
89,600 KB |
testcase_04 | AC | 164 ms
89,088 KB |
testcase_05 | AC | 165 ms
89,216 KB |
testcase_06 | AC | 165 ms
89,344 KB |
testcase_07 | AC | 170 ms
89,344 KB |
testcase_08 | AC | 153 ms
89,088 KB |
testcase_09 | AC | 150 ms
89,260 KB |
testcase_10 | AC | 149 ms
88,960 KB |
testcase_11 | AC | 152 ms
89,472 KB |
testcase_12 | AC | 149 ms
89,124 KB |
testcase_13 | AC | 148 ms
88,576 KB |
testcase_14 | AC | 150 ms
88,704 KB |
testcase_15 | AC | 147 ms
89,068 KB |
testcase_16 | AC | 133 ms
86,016 KB |
testcase_17 | AC | 130 ms
85,632 KB |
testcase_18 | AC | 151 ms
89,088 KB |
testcase_19 | AC | 169 ms
89,344 KB |
ソースコード
import itertools as iter import collections as coll import heapq as hq import bisect as bis from decimal import Decimal as dec from functools import cmp_to_key import math import sys #import pypyjit #pypyjit.set_param('max_unroll_recursion=-1') sys.setrecursionlimit(10 ** 6) inp = sys.stdin.readline input = lambda : inp().rstrip() getN = lambda : int(inp()) getNs = lambda : map(int, inp().split()) getList = lambda :list(map(int, inp().split())) getStrs = lambda n : [input() for _ in [0] * n] def yexit(): print("Yes"); exit(0) def nexit(): print("No"); exit(0) pi = 3.141592653589793 mod = 1000000007 MOD = 998244353 INF = 4611686018427387903 dx = [1, 0, -1, 0]; dy = [0, 1, 0, -1] #di = coll.defaultdict(int) class ModInt: mod = 998244353 def __init__(self, x): self.x = x % ModInt.mod @classmethod def set_mod(cls, mod: int) -> None: ModInt.mod = mod def __str__(self): return str(self.x) __repr__ = __str__ def __add__(self, other): return (ModInt(self.x + other.x) if isinstance(other, ModInt) else ModInt(self.x + other)) def __sub__(self, other): return (ModInt(self.x - other.x) if isinstance(other, ModInt) else ModInt(self.x - other)) def __mul__(self, other): return (ModInt(self.x * other.x) if isinstance(other, ModInt) else ModInt(self.x * other)) def __truediv__(self, other): return (ModInt(self.x * self.inv_mod(other.x, self.mod)) if isinstance(other, ModInt) else ModInt(self.x * self.inv_mod(other, self.mod))) def __pow__(self, other): return ModInt(pow(self.x, other.x, ModInt.mod)) if isinstance(other, ModInt) else ModInt(pow(self.x, other, ModInt.mod)) __radd__ = __add__ def __rsub__(self, other): return (ModInt(other.x - self.x) if isinstance(other, ModInt) else ModInt(other - self.x)) __rmul__ = __mul__ def __rtruediv__(self, other): return (ModInt(other.x * self.inv_mod(self.x, self.mod)) if isinstance(other, ModInt) else ModInt(other * self.inv_mod(self.x, self.mod))) def __rpow__(self, other): return ModInt(pow(other.x, self.x, ModInt.mod)) if isinstance(other, ModInt) else ModInt(pow(other, self.x, ModInt.mod)) def __iadd__(self, other): self = self + other return self def __isub__(self, other): self = self - other return self def __imul__(self, other): self = self * other return self def __itruediv__(self, other): self = self / other return self @classmethod def inv_gcd(cls, n, m): n %= m if(n == 0): return m, 0 s, t, m0, m1 = m, n, 0, 1 while(t): u = s // t s -= t * u m0 -= m1 * u m0, m1, s, t = m1, m0, t, s if(m0 < 0): m0 += m // s return s, m0 @classmethod def inv_mod(cls, n, m): _, im = cls.inv_gcd(n, m) return im @classmethod def prod(cls, A): ret = ModInt(1) for k in A: ret *= k return ret @classmethod def nPk(cls, n, k): if(isinstance(n, ModInt)): n = n.x if(isinstance(k, ModInt)): k = k.x return cls.prod([*range(n - k + 1, n + 1)]) @classmethod def nCk(cls, n, k): if(isinstance(n, ModInt)): n = n.x if(isinstance(k, ModInt)): k = k.x r = min(n - k, k) return cls.nPk(n, r) / cls.nPk(r, r) class Matrix: def __init__(self, A: list): if not(A and isinstance(A[0], list)): A = [A] self.A = A self.row = len(A) self.col = len(A[0]) self.I = None def set_A(self, A: list) -> None: self.A = A def set_I(self, I) -> None: self.I = I def __str__(self): return str(self.A) __repr__ = __str__ def __add__(self, other): ret = Matrix(self) for i in range(self.row): for j in range(self.col): ret.A[i][j] = self.A[i][j] + other.A[i][j] return ret def __sub__(self, other): ret = Matrix(self) for i in range(self.row): for j in range(self.col): ret.A[i][j] = self.A[i][j] - other.A[i][j] return ret def __mul__(self, other): assert(self.col == other.row) ret = Matrix([[0]*other.col for _ in [0]*self.row]) for i in range(self.row): for j in range(other.col): ret.A[i][j] = sum(self.A[i][k] * other.A[k][j] for k in range(self.col)) return ret def __pow__(self, other: int): mat = self ret = Matrix(self.I) n = other while(n): if(n & 1): ret = mat * ret mat = mat * mat n >>= 1 return ret """ Main Code """ n = getN() A = Matrix([ [ModInt(1), ModInt(0), ModInt(0), ModInt(0)], [ModInt(0), ModInt(0), ModInt(0), ModInt(0)], [ModInt(0), ModInt(0), ModInt(1), ModInt(1)], [ModInt(1), ModInt(0), ModInt(1), ModInt(0)] ]) v = Matrix([ [ModInt(1)], [ModInt(0)], [ModInt(0)], [ModInt(0)]]) A.set_I([ [ModInt(1), ModInt(0), ModInt(0), ModInt(0)], [ModInt(0), ModInt(1), ModInt(0), ModInt(0)], [ModInt(0), ModInt(0), ModInt(1), ModInt(0)], [ModInt(0), ModInt(0), ModInt(0), ModInt(1)] ]) ans = (A ** (n - 1)) * v # print(ans) print(ans.A[2][0] + ans.A[3][0])