結果
| 問題 |
No.187 中華風 (Hard)
|
| コンテスト | |
| ユーザー |
neterukun
|
| 提出日時 | 2021-05-03 13:50:19 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 442 ms / 3,000 ms |
| コード長 | 1,570 bytes |
| コンパイル時間 | 290 ms |
| コンパイル使用メモリ | 82,600 KB |
| 実行使用メモリ | 77,064 KB |
| 最終ジャッジ日時 | 2024-07-22 04:06:46 |
| 合計ジャッジ時間 | 7,946 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 25 |
ソースコード
def extended_gcd(a, b):
if b == 0:
return a, 1, 0
else:
g, y, x = extended_gcd(b, a % b)
y -= (a // b) * x
return g, x, y
def mod_inv(a, p):
_, x, _ = extended_gcd(a, p)
return x % p
def pregarner(b, m, MOD):
def gcd(a, b):
while b:
a, b = b, a % b
return a
res = 1
n = len(b)
for i in range(n):
for j in range(i):
g = gcd(m[i], m[j])
if (b[i] - b[j]) % g != 0:
return -1
m[i] //= g
m[j] //= g
gi = gcd(m[i], g)
gj = g // gi
while True:
g = gcd(gi, gj)
gi *= g
gj //= g
if g == 1:
break
m[i] *= gi
m[j] *= gj
b[i] %= m[i]
b[j] %= m[j]
for i in range(n):
res = res * m[i] % MOD
return res
def garner(a, m, MOD):
n = len(m)
m = m + [MOD]
coeff = [1] * (n + 1)
res = [0] * (n + 1)
for i in range(n):
t = (a[i] - res[i]) * mod_inv(coeff[i], m[i]) % m[i]
for j in range(i + 1, n + 1):
res[j] = (res[j] + t * coeff[j]) % m[j]
coeff[j] = coeff[j] * m[i] % m[j]
return res[-1]
n = int(input())
info = [list(map(int, input().split())) for i in range(n)]
MOD = 10 ** 9 + 7
x, y = list(zip(*info))
x, y = list(x), list(y)
lcm = pregarner(x, y, MOD)
if sum(x) == 0:
print(lcm)
elif lcm == -1:
print(lcm)
else:
m = garner(x, y, MOD)
print(m)
neterukun