結果
| 問題 |
No.186 中華風 (Easy)
|
| コンテスト | |
| ユーザー |
こどこど
|
| 提出日時 | 2020-09-17 00:37:54 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,394 bytes |
| コンパイル時間 | 161 ms |
| コンパイル使用メモリ | 82,316 KB |
| 実行使用メモリ | 54,528 KB |
| 最終ジャッジ日時 | 2024-06-22 03:49:39 |
| 合計ジャッジ時間 | 1,921 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 WA * 15 |
ソースコード
# 拡張ユークリッドの互除法でgcd(a, b) と ax ≡ gcd(a, b) (mod b)となるxを求める
# x は a/gcd(a, b) の b/gcd(a,b) を法とした逆元ともいえる。
def gcd_inverse(a, b):
a = a % b
if a == 0:
return b, 0
s, xs = b, 0
t, xt = a, 1
while t:
n = s // t
s, t = t, s % t
xs, xt = xt, xs - n * xt
if xs < 0:
xs += a // s
return s, xs
def crt(b, m):
assert len(b) == len(m)
n = len(b)
b0, m0 = 0, 1
for i in range(n):
assert 1 <= m[i]
b1 = b[i] % m[i]
m1 = m[i]
if m0 < m1:
m0, m1 = m1, m0
b0, b1 = b1, b0
if m0 % m1 == 0:
# m0 = lcm(m0, m1), m1 = gcd(m0, m1) なので b0 ≡ b1 (mod m1) が解が存在する条件であり、b0が解になる
if b0 % m1 != b1:
return 0, 0
continue
# m0 * p + m1 * q = gcd(m0, m1)
d, p = gcd_inverse(m0, m1)
q = m1 // d
# b0 ≡ b1 (mod gcd(m0, m1)) の不成立
if (b1 - b0) % d:
return 0, 0
# x = b0 + (b1 - b0) // g * m0 * p
b0 += (b1 - b0) // d % q * p % q * m0
# lcm(m0, m1)
m0 *= q
return b0, m0
x = [0] * 3
y = [0] * 3
for i in range(3):
x[i], y[i] = map(int, input().split())
ans, _ = crt(x, y)
print(ans if ans else -1)
こどこど