結果
| 問題 | No.186 中華風 (Easy) |
| コンテスト | |
| ユーザー |
しあん@Nikke🍑😈ྀི
|
| 提出日時 | 2026-04-26 18:18:00 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,169 bytes |
| 記録 | |
| コンパイル時間 | 3,598 ms |
| コンパイル使用メモリ | 332,220 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-04-26 18:18:05 |
| 合計ジャッジ時間 | 3,395 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
#define rep(i, x) for (ll i = 0; i < x; ++i)
template <typename T>
T extgcd(T a, T b, T &x, T &y) {
T d = a;
if (b != 0) {
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1;
y = 0;
}
return d;
}
ll safe_mod(ll a, ll m)
{
return (a % m + m) % m;
}
int main ()
{
ll n = 3;
vll R(n), M(n);
rep(i, n)
{
cin >> R[i] >> M[i];
}
ll r = 0;
ll m = 1;
rep(i, n)
{
ll p, q;
ll d = extgcd(m, M[i], p, q);
if ((R[i] - r) % d != 0)
{
cout << -1 << endl;
return 0;
}
ll m2_d = M[i] / d;
ll m_next = m * M[i] / d; // mとM[i]の最小公倍数 m_nextを法とする剰余環が中国式剰余定理より同型。
ll tmp = safe_mod(p, m2_d) * safe_mod((R[i] - r) / d, m2_d) % m2_d;
ll r_next = safe_mod(r + tmp * m, m_next);
r = r_next;
m = m_next;
}
// 答えは正の整数でなくてはならない
if (r == 0)
{
r += m;
}
cout << r << endl;
}
しあん@Nikke🍑😈ྀི