結果
問題 | No.2487 Multiple of M |
ユーザー |
![]() |
提出日時 | 2023-09-29 23:47:33 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,891 bytes |
コンパイル時間 | 187 ms |
コンパイル使用メモリ | 82,160 KB |
実行使用メモリ | 80,896 KB |
最終ジャッジ日時 | 2024-07-23 06:55:27 |
合計ジャッジ時間 | 7,214 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 51 WA * 2 |
ソースコード
from collections import defaultdict, deque, Counterimport copyfrom itertools import combinations, permutations, product, accumulate, groupby, chainfrom heapq import heapify, heappop, heappushimport mathimport bisectfrom pprint import pprintfrom random import randintimport sys# sys.setrecursionlimit(700000)input = lambda: sys.stdin.readline().rstrip('\n')inf = float('inf')mod1 = 10**9+7mod2 = 998244353def ceil_div(x, y): return -(-x//y)#################################################class Matrix():def __init__(self, mat, mod=None):self.mat = matself.n = len(mat)self.m = len(mat[0])self.mod = moddef __mul__(self, other):ret = Matrix([[0]*other.m for _ in range(self.n)], self.mod)for i in range(self.n):for j in range(other.m):for k in range(self.m):ret[i][j] += self.mat[i][k]*other.mat[k][j]if self.mod is not None: ret[i][j] %= self.modreturn retdef __add__(self, other):ret = Matrix([[self.mat[i][j] for j in range(self.m)] for i in range(self.n)], self.mod)for i in range(other.n):for j in range(other.m):ret[i][j] += other.mat[i][j]if self.mod is not None: ret[i][j] %= self.modreturn retdef __sub__(self, other):ret = Matrix([[self.mat[i][j] for j in range(self.m)] for i in range(self.n)], self.mod)for i in range(other.n):for j in range(other.m):ret[i][j] -= other.mat[i][j]if self.mod is not None: ret[i][j] %= self.modreturn retdef __pow__(self, scalar):a = Matrix([[self.mat[i][j] for j in range(self.m)] for i in range(self.n)], self.mod)ret = Matrix.e(self.n, self.mod)while scalar:if scalar&1:ret *= aa *= ascalar >>= 1return retdef scalar_mul(self, a):ret = Matrix([[self.mat[i][j] for j in range(self.m)] for i in range(self.n)], self.mod)for i in range(self.n):for j in range(self.m):ret[i][j] *= aif self.mod is not None: ret[i][j] %= self.modreturn retdef __repr__(self) -> str:return self.mat.__repr__()def __getitem__(self, i):return self.mat[i]def __setitem__(self, i, x):self.mat[i] = xdef __len__(self):return len(self.mat)def t(self):return Matrix([list(column) for column in zip(*self.mat)], self.mod)def turn(matrix):if type(matrix) != 'Matrix':return Matrix([list(column) for column in zip(*matrix)])return Matrix([list(column) for column in zip(*matrix.mat)], matrix.mod)def e(size, mod):return Matrix([[i == j for j in range(size)] for i in range(size)], mod)def prime_factorize(n):ret = defaultdict(int)i = 2while i*i <= n:if n%i == 0:ret[i] += 1n //= ielse:i += 1if n != 1:ret[n] += 1return retN, M, K = map(int, input().split())a = Matrix([[0], [1]], mod=mod2)PM, PK = prime_factorize(M), prime_factorize(K)x = 0s = {}for p, e in PM.items():if PK[p] == 0: continues[p] = PK[p]x = max(x, ceil_div(e, PK[p]))i = 0while i < min(x, N):d = 1for p, e in s.items():d *= p**min(PM[p], e*(i+1))l = M//dif l == 1:print(0)exit()A = Matrix([[d-1, d*(l-1)%mod2], [d, (d-1+d*(l-2))%mod2]], mod=mod2)a = A*ai += 1if i == N:print(a[0][0])exit()d = 1for p, e in s.items():d *= p**min(PM[p], e*(i+1))l = M//dif l == 1:print(0)else:A = Matrix([[d-1, d*(l-1)%mod2], [d, (d-1+d*(l-2))%mod2]], mod=mod2)a = A**(N-1-i) * aprint(a[0][0])