結果
| 問題 |
No.187 中華風 (Hard)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-09-21 14:21:13 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 571 ms / 3,000 ms |
| コード長 | 2,828 bytes |
| コンパイル時間 | 210 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 78,796 KB |
| 最終ジャッジ日時 | 2024-07-07 08:08:09 |
| 合計ジャッジ時間 | 7,457 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 25 |
ソースコード
import sys
V = sys.version_info
_39 = False
_310 = False
_311 = False
if V.major == 3:
_39 = V.minor >= 9
_310 = V.minor >= 10
_311 = V.minor >= 11
if _39:
li = list
tup = tuple
dic = dict
st = set
ty = type
else:
from typing import (
List,
Tuple,
Type,
Dict,
Set,
)
li = List
tup = Tuple
dic = Dict
st = Set
ty = Type
from sys import stdin
read = stdin.buffer.read
rl = stdin.buffer.readline
rb = lambda: rl().split()
rls = stdin.buffer.readlines
from typing import (
TypeVar,
Sequence as Seq,
Iterable as Iter,
Protocol as Proto,
Generic as Gen,
)
from typing import Callable as Fn
from typing import Iterable
def prints(
a: Iterable[object],
sep: str = "\n",
) -> None:
print(sep.join(map(str, a)))
# import numpy as np
def egcd(
a: int,
b: int,
) -> tup[int, int, int]:
if not b:
if a < 0:
return -a, -1, 0
return a, 1, 0
q, r = divmod(a, b)
g, s, t = egcd(b, r)
return g, t, s - q * t
def crt_mod(
m: Seq[int],
r: Seq[int],
mod: int,
) -> int:
l = len(m)
assert len(r) == l
m = list(m) + [mod]
p = [1] * (l + 1)
x = [0] * (l + 1)
for i, (n, b) in enumerate(zip(m, r)):
assert n > 0
g, ip, _ = egcd(p[i], n)
assert g == 1
t = (b - x[i]) % n * ip % n
for j in range(i + 1, l + 1):
x[j] += t * p[j]
x[j] %= m[j]
p[j] = p[j] * n % m[j]
return x[-1]
def factorize(n: int) -> li[tup[int, int]]:
f = []
for i in range(2, n):
if i * i > n:
break
if n % i:
continue
c = 0
while n % i == 0:
n //= i
c += 1
f.append((i, c))
if n > 1:
f.append((n, 1))
return f
def to_coprime(mr: li[tup[int, int]]):
f = dict()
for m, r in mr:
for p, e in factorize(m):
n = pow(p, e)
b = r % n
l, a = f.get(p, (1, 0))
if l < n:
l, n = n, l
a, b = b, a
if a % n != b:
mr.clear()
return
f[p] = (l, a)
mr.clear()
for x in f.values():
mr.append(x)
def solve() -> None:
n = int(rl())
mr = []
for _ in range(n):
r, m = map(int, rb())
mr.append((m, r))
to_coprime(mr)
n = len(mr)
if n == 0:
print(-1)
return
m, r = tuple(zip(*mr))
mod = 10**9 + 7
if max(r) > 0:
x = crt_mod(m, r, mod)
print(x)
return
l = 1
for x in m:
l = l * x % mod
print(l)
def main() -> None:
t = 1
# t = int(rl())
for _ in range(t):
solve()
main()