結果
問題 | No.186 中華風 (Easy) |
ユーザー | こどこど |
提出日時 | 2020-09-17 01:11:49 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 42 ms / 2,000 ms |
コード長 | 1,487 bytes |
コンパイル時間 | 281 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 52,352 KB |
最終ジャッジ日時 | 2024-07-19 18:41:20 |
合計ジャッジ時間 | 1,919 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 37 ms
52,224 KB |
testcase_01 | AC | 37 ms
52,224 KB |
testcase_02 | AC | 36 ms
52,096 KB |
testcase_03 | AC | 36 ms
51,840 KB |
testcase_04 | AC | 38 ms
52,096 KB |
testcase_05 | AC | 39 ms
52,224 KB |
testcase_06 | AC | 37 ms
52,224 KB |
testcase_07 | AC | 39 ms
52,352 KB |
testcase_08 | AC | 42 ms
51,840 KB |
testcase_09 | AC | 36 ms
51,968 KB |
testcase_10 | AC | 38 ms
52,096 KB |
testcase_11 | AC | 39 ms
52,096 KB |
testcase_12 | AC | 39 ms
52,224 KB |
testcase_13 | AC | 36 ms
51,968 KB |
testcase_14 | AC | 35 ms
52,096 KB |
testcase_15 | AC | 35 ms
51,968 KB |
testcase_16 | AC | 35 ms
52,224 KB |
testcase_17 | AC | 34 ms
51,840 KB |
testcase_18 | AC | 36 ms
51,968 KB |
testcase_19 | AC | 36 ms
52,224 KB |
testcase_20 | AC | 39 ms
51,712 KB |
testcase_21 | AC | 39 ms
52,096 KB |
testcase_22 | AC | 37 ms
51,968 KB |
ソースコード
# 拡張ユークリッドの互除法で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, m0 = b, 0 t, m1 = a, 1 while t: n = s // t s, t = t, s - n * t m0, m1 = m1, m0 - n * m1 if m0 < 0: m0 += b // s return s, m0 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 * p * m0 # lcm(m0, m1) m0 *= q b0 %= m0 if b0 < 0: b0 += m0 return b0, m0 x = [0] * 3 y = [0] * 3 for i in range(3): x[i], y[i] = map(int, input().split()) ans, m = crt(x, y) if not m: print(-1) elif ans == 0: print(m) else: print(ans)