結果
問題 |
No.3022 一元一次式 mod 1000000000
|
ユーザー |
|
提出日時 | 2025-02-14 23:45:05 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,029 bytes |
コンパイル時間 | 2,922 ms |
コンパイル使用メモリ | 275,044 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2025-02-14 23:45:32 |
合計ジャッジ時間 | 6,739 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 8 WA * 12 |
ソースコード
#include<bits/stdc++.h> using namespace std; long long gcd_ext(long long a, long long b, long long &x, long long &y) { if (b == 0) { x = 1; y = 0; return a; } else { long long d = gcd_ext(b, a % b, y, x); y -= a / b * x; return d; } } long long inverse(long long a, long long P) { // aの逆元を求める long long x, y; gcd_ext(a, P, x, y); return (P + x % P) % P; } long long f(long long a, long long b, long long mod){ long long inva = inverse(a, mod); cerr << b << " " << inva << " " << mod << " " << a*inva%mod << endl; return (b*inva)%mod; } void solve(){ long long n, m; cin >> n >> m; long long mod = 1000000000; n %= mod; m = (mod - m%mod)%mod; long long g = __gcd(n, __gcd(m, mod)); if((n == 0 && m != 0) || __gcd(n/g, mod/g) != 1){ cout << -1 << endl; return; } n /= g; mod /= g; cerr << n << " " << m << " " << mod << endl; cout << f(n, m, mod) << endl; return; } int main(){ int t; cin >> t; while(t--){ solve(); } }