結果
| 問題 |
No.187 中華風 (Hard)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-09-21 14:31:14 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 770 ms / 3,000 ms |
| コード長 | 3,132 bytes |
| コンパイル時間 | 135 ms |
| コンパイル使用メモリ | 13,184 KB |
| 実行使用メモリ | 12,288 KB |
| 最終ジャッジ日時 | 2024-07-07 08:08:33 |
| 合計ジャッジ時間 | 12,456 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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
from math import gcd
def to_coprime(
m: int,
a: int,
n: int,
b: int,
) -> tup[int, int, int, int]:
g = gcd(m, n)
if (a - b) % g:
return (-1, -1, -1, -1)
m //= g
n //= g
u = gcd(m, g)
v = g // u
while g > 1:
g = gcd(u, v)
u *= g
v //= g
m *= u
n *= v
a %= m
b %= n
return m, a, n, b
def to_pairwise_coprime(
m: li[int],
r: li[int],
) -> bool:
n = len(m)
assert len(r) == n
for i in range(n):
for j in range(i):
(
m[i],
r[i],
m[j],
r[j],
) = to_coprime(
m[i], r[i], m[j], r[j]
)
if m[i] == -1:
return False
return True
def solve() -> None:
n = int(rl())
rm = [map(int, rb()) for _ in range(n)]
r, m = map(list, zip(*rm))
if not to_pairwise_coprime(m, r):
print(-1)
return
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()