結果

問題 No.3022 一元一次式 mod 1000000000
ユーザー Tatsu_mr
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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";
        }
    }
}
0