結果
| 問題 |
No.2117 中国剰余定理入門
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-11-18 20:29:46 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 962 bytes |
| コンパイル時間 | 1,757 ms |
| コンパイル使用メモリ | 195,596 KB |
| 最終ジャッジ日時 | 2025-02-08 21:19:42 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 14 WA * 6 |
ソースコード
// हर हर महादेव
#include <bits/stdc++.h>
using namespace std;
template <typename T>
T inv(T a, T m) {
T u = 0, v = 1;
T old = m;
while (a != 0) {
T t = m / a;
m -= t * a; swap(a, m);
u -= t * v; swap(u, v);
}
assert(m == 1);
if(u < 0){
u += old;
}
return u;
}
// x == a[i] mod m[i]
int crt(vector<int> a,vector<int> m){
int n = a.size();
int prod = 1;
vector<int> M(n);
vector<int> y(n);
for(int i = 0; i < n; i++){
prod *= m[i];
}
for(int i = 0; i < n; i++){
M[i] = prod / m[i];
if(__gcd(M[i],m[i]) != 1){
return -1;
}
y[i] = inv(M[i],m[i]);
}
int x = 0;
for(int i = 0; i < n; i++){
(x += a[i] * y[i] * M[i]) %= prod;
}
return x;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
vector<int> a(2),m(2);
for(int i = 0; i < 2; i++){
cin >> m[i] >> a[i];
if(a[i] < 0){
a[i] += m[i];
}
}
int ans = crt(a,m);
if(ans == -1){
cout << "NaN";
}
else{
cout << ans;
}
return 0;
}