結果
| 問題 |
No.187 中華風 (Hard)
|
| コンテスト | |
| ユーザー |
akasia_midori
|
| 提出日時 | 2023-11-23 03:02:31 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 131 ms / 3,000 ms |
| コード長 | 1,856 bytes |
| コンパイル時間 | 284 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 77,568 KB |
| 最終ジャッジ日時 | 2024-09-26 07:51:01 |
| 合計ジャッジ時間 | 3,115 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 25 |
ソースコード
import functools
import math
def lcm2(x, y):
gcd = math.gcd(x, y)
return gcd * (x // gcd) * (y // gcd)
gcd = lambda l: functools.reduce(math.gcd, l)
lcm = lambda l: functools.reduce(lcm2, l)
import math
# Extended Euclidean Algorithm
def extgcd(a, b):
if b:
d, y, x = extgcd(b, a % b)
y -= (a // b)*x
return d, x, y
return a, 1, 0
def Chineese_mod_theory(b, m):
# 求めたいxがあって m1とm2が互いに疎であり、x%m1≡b1, x%m2≡b2であるとき
# x = b1m2 + b2m1 である
# 例えば b1m2%m1≡b1, b2m1%m1≡0である
# これは拡張ユークリッドの互除法で考えると
# m1p1 + m2p2 = d(=gcd(m1, m2))
# s = (b1-b2)/d と置くと
# m1p1s + m2p2s = b1-b2
# x = b2 + m2p2s, x = b1 - m1p1s
# のどっちかを解けばいい
MOD = 10**9 + 7
M = 1
r = 0
for i in range(len(b)):
d, p1, p2 = extgcd(M, m[i])
if (b[i]-r)%d != 0:
return (-1,0)
s = (b[i]-r)//d
tmp = (s * p1) % (m[i]//d)
r = (r + M*tmp)
M = (M * (m[i]//d))
return (r%M)%MOD, M%MOD
def oi(): return int(input())
def os(): return input()
def mi(): return list(map(int, input().split()))
# import sys
# input = sys.stdin.readline
# import sys
# sys.setrecursionlimit(10**8)
# import pypyjit
# pypyjit.set_param('max_unroll_recursion=-1')
# input_count = 0
input_count = 0
N = oi()
amari = []
wari = []
all_zero = True
for _ in range(N):
x,y = mi()
wari.append(y)
amari.append(x)
if x != 0:
all_zero = False
if all_zero:
# amari, wari = pre_garner(amari, wari)
out = lcm(wari)
print(out%(10**9+7))
else:
# amari, wari = pre_garner(amari, wari)
# if amari is None:
# print(-1)
# else:
out = Chineese_mod_theory(amari, wari)
print(out[0])
akasia_midori