結果
問題 |
No.3022 一元一次式 mod 1000000000
|
ユーザー |
![]() |
提出日時 | 2025-02-18 15:35:22 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 82 ms / 2,000 ms |
コード長 | 2,426 bytes |
コンパイル時間 | 3,359 ms |
コンパイル使用メモリ | 274,888 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2025-02-18 15:35:27 |
合計ジャッジ時間 | 4,933 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define For(i, a, b) for(int i = (a); i < (b); i++) #define rep(i, n) For(i, 0, n) #define rFor(i, a, b) for(int i = (a); i >= (b); i--) #define ALL(v) (v).begin(), (v).end() #define rALL(v) (v).rbegin(), (v).rend() using lint = long long; using ld = long double; int INF = 2000000000; lint LINF = 1000000000000000000; struct SetupIo { SetupIo() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); } } setupio; namespace math { template <class T> T div_floor(T a, T b) { assert(b != 0); if (b < 0) { a = -a; b = -b; } return (a >= 0 ? a / b : (a + 1) / b - 1); } template <class T> T div_ceil(T a, T b) { assert(b != 0); if (b < 0) { a = -a; b = -b; } return (a > 0 ? (a - 1) / b + 1 : a / b); } template <class T> T bin_gcd(T a_, T b_) { unsigned long long a = abs(a_), b = abs(b_); if (a == 0 || b == 0) { return (a == 0 ? b : a); } int x = __builtin_ctzll(a), y = __builtin_ctzll(b); a >>= x; b >>= y; while (a != b) { if (a < b) { swap(a, b); } a -= b; a >>= __builtin_ctzll(a); } return (a << min(x, y)); } template <class T = long long> T ext_gcd(T a, T b, T &x, T &y) { if (b == 0) { x = (a >= 0 ? 1 : -1); y = 0; return abs(a); } T g = ext_gcd(b, a % b, y, x); y -= a / b * x; return g; } template <class T = long long> T bezout_coef(T a, T b, T c, T &x, T &y) { T g = ext_gcd(a, b, x, y); if (abs(c) % g) { return -1; } a /= g, b /= g, c /= g; if (b == 0) { x *= c; return g; } using bint = __int128_t; bint nx = bint(x) * bint(c); bint ny = bint(y) * bint(c); bint q = (b < 0 ? div_floor<bint>(-nx, b) : div_ceil<bint>(-nx, b)); nx += b * q; ny -= a * q; x = nx; y = ny; return g; } } // namespace math using namespace math; const lint mod = 1000000000; int main() { int t; cin >> t; while (t--) { lint n, m; cin >> n >> m; lint x, y; lint g = bezout_coef(n, -mod, -m, x, y); if (g == -1) { cout << -1 << "\n"; } else { if (x == 0) { x += mod / g; } cout << x << "\n"; } } }