結果
| 問題 |
No.186 中華風 (Easy)
|
| コンテスト | |
| ユーザー |
kyo1
|
| 提出日時 | 2020-09-25 10:17:59 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,201 bytes |
| コンパイル時間 | 1,720 ms |
| コンパイル使用メモリ | 198,800 KB |
| 最終ジャッジ日時 | 2025-01-14 20:29:16 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template <typename T>
std::tuple<T, T, T> egcd(T a, T b) {
T x = 1, y = 0, u = 0, v = 1;
while (b != 0) {
T t = a / b;
a -= t * b;
x -= t * u;
y -= t * v;
std::swap(a, b);
std::swap(x, u);
std::swap(y, v);
}
return {a, x, y};
}
template <typename T>
std::optional<std::pair<T, T>> crt(const std::vector<T> &r, const std::vector<T> &m) {
assert(r.size() == m.size());
T x = 0, y = 1;
for (std::size_t i = 0; i < r.size(); i++) {
T u = r[i], v = m[i];
if (y < v) {
std::swap(x, u);
std::swap(y, v);
}
auto [d, a, _] = egcd(y, v);
if ((u - x) % d != 0) return std::nullopt;
T t = v / d;
x += (u - x) / d % t * a % t * y;
y *= t;
}
if (x < 0) x += y;
return std::make_pair(x, y);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
vector<int64_t> X(3), Y(3);
for (int i = 0; i < 3; i++) {
cin >> X[i] >> Y[i];
}
auto res = crt(X, Y);
if (res) {
if (res.value().first == 0) {
cout << res.value().second << '\n';
} else {
cout << res.value().first << '\n';
}
} else {
cout << -1 << '\n';
}
return 0;
}
kyo1