結果
問題 | No.186 中華風 (Easy) |
ユーザー | rpy3cpp |
提出日時 | 2015-09-18 20:00:17 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
AC
|
実行時間 | 29 ms / 2,000 ms |
コード長 | 2,469 bytes |
コンパイル時間 | 141 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 10,752 KB |
最終ジャッジ日時 | 2024-07-19 18:27:06 |
合計ジャッジ時間 | 1,476 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 27 ms
10,624 KB |
testcase_01 | AC | 29 ms
10,624 KB |
testcase_02 | AC | 25 ms
10,752 KB |
testcase_03 | AC | 25 ms
10,624 KB |
testcase_04 | AC | 26 ms
10,752 KB |
testcase_05 | AC | 25 ms
10,624 KB |
testcase_06 | AC | 25 ms
10,752 KB |
testcase_07 | AC | 25 ms
10,624 KB |
testcase_08 | AC | 26 ms
10,496 KB |
testcase_09 | AC | 26 ms
10,624 KB |
testcase_10 | AC | 25 ms
10,624 KB |
testcase_11 | AC | 24 ms
10,624 KB |
testcase_12 | AC | 25 ms
10,624 KB |
testcase_13 | AC | 27 ms
10,496 KB |
testcase_14 | AC | 27 ms
10,752 KB |
testcase_15 | AC | 26 ms
10,624 KB |
testcase_16 | AC | 25 ms
10,624 KB |
testcase_17 | AC | 24 ms
10,624 KB |
testcase_18 | AC | 27 ms
10,752 KB |
testcase_19 | AC | 28 ms
10,752 KB |
testcase_20 | AC | 28 ms
10,624 KB |
testcase_21 | AC | 28 ms
10,752 KB |
testcase_22 | AC | 25 ms
10,624 KB |
ソースコード
def gcd_ext(m: int, n: int) -> (int, int, int): '''拡張ユークリッドの互除法 mx + ny = gcd(x, y) となる、gcd(x, y), x, y を返す。 ''' x, y, u, v = 1, 0, 0, 1 while n: k, m = divmod(m, n) m, n = n, m x, y, u, v = u, v, x - u * k, y - v * k return m, x, y def read_data(): x1, y1 = map(int, input().split()) x2, y2 = map(int, input().split()) x3, y3 = map(int, input().split()) return x1, y1, x2, y2, x3, y3 def solve2(x1, y1, x2, y2): ''' z = x1 + m*y1 ...(1) z = x2 + n*y2 ...(2) を満たす、非負の整数で最小の z および y1, y2 の lcm を返す。 そのような z が存在しないときは、z = -1 を返す。 gcd = a * y1 + b * y2 ...(3) とする。 lcm = y1 * y2 // gcd である。 y1 = t1 * gcd ...(4) y2 = t2 * gcd ...(5) とする。 (1), (2), (4), (5) より、 x1 + m * t1 * gcd = x2 + n * t2 * gcd x1 - x2 = (-m * t1 + n * t2) * gcd x1 - x2 = x12 とすると、 x12 は、gcd の倍数のはずである。 k = x12 // gcd とすると k = -m * t1 + n * t2 ...(6) (3) に (4), (5) を代入して、両辺を gcd で割ると、 1 = a * t1 + b * t2 ...(7) 両辺を k 倍すると、 k = k * a * t1 + k * b * t2 = k * a * t1 + kb * t2 + p * t1 * t2 - p * t1 * t2 = (k * a + p * t2) * t1 + (k * b - p * t1) * t2 ... (8) ただし、 p は、任意の整数 (6), (8) より、 -m = k * a + p * t2 ...(9) n = k * b - p * t1 ...(10) となる整数 p が存在するはず。 (9), (10) を、(1), (2) に代入すると、 z = x1 - (k * a + p * t2) * y1 = x1 - k * a * y1 + t2 * y1 * p = x1 - k * a * y1 + lcm * p z = x2 + (k * b - p * t1) * y2 = x2 + k ( b * y2 - lcm * p よって、 z = (x1 - k * a * y1) % lcm あるいは、 z = (x2 - k * b * y2) % lcm とすれば良い。 ''' gcd, a, b = gcd_ext(y1, y2) lcm = y1 * y2 // gcd k, r = divmod(x1 - x2, gcd) if r != 0: return -1, lcm z = (x1 - k * a * y1) % lcm return z, lcm def solve3(x1, y1, x2, y2, x3, y3): x12, y12 = solve2(x1, y1, x2, y2) if x12 == -1: return -1 # z % y12 = x12 and z % y3 = x3 z, lcm = solve2(x12, y12, x3, y3) if z == 0: return lcm return z x1, y1, x2, y2, x3, y3 = read_data() print(solve3(x1, y1, x2, y2, x3, y3))