結果
問題 | No.187 中華風 (Hard) |
ユーザー | dsytk7 |
提出日時 | 2019-04-18 16:04:57 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 206 ms / 3,000 ms |
コード長 | 3,636 bytes |
コンパイル時間 | 2,058 ms |
コンパイル使用メモリ | 175,924 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-22 09:17:08 |
合計ジャッジ時間 | 5,701 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 3 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 161 ms
6,944 KB |
testcase_03 | AC | 158 ms
6,944 KB |
testcase_04 | AC | 205 ms
6,940 KB |
testcase_05 | AC | 204 ms
6,940 KB |
testcase_06 | AC | 204 ms
6,944 KB |
testcase_07 | AC | 206 ms
6,944 KB |
testcase_08 | AC | 145 ms
6,944 KB |
testcase_09 | AC | 146 ms
6,944 KB |
testcase_10 | AC | 146 ms
6,940 KB |
testcase_11 | AC | 205 ms
6,940 KB |
testcase_12 | AC | 205 ms
6,940 KB |
testcase_13 | AC | 62 ms
6,940 KB |
testcase_14 | AC | 63 ms
6,940 KB |
testcase_15 | AC | 150 ms
6,940 KB |
testcase_16 | AC | 152 ms
6,940 KB |
testcase_17 | AC | 2 ms
6,940 KB |
testcase_18 | AC | 3 ms
6,940 KB |
testcase_19 | AC | 2 ms
6,944 KB |
testcase_20 | AC | 157 ms
6,944 KB |
testcase_21 | AC | 2 ms
6,944 KB |
testcase_22 | AC | 205 ms
6,940 KB |
testcase_23 | AC | 2 ms
6,940 KB |
testcase_24 | AC | 2 ms
6,944 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for (int (i)=(0);(i)<(int)(n);++(i)) using ll = long long; using P = pair<ll, ll>; template<class T> inline bool chmax(T& a, T b) {if (a < b){a = b;return 1;}return 0;} template<class T> inline bool chmin(T& a, T b) {if (a > b){a = b;return 1;}return 0;} const long long LLINF = 1LL << 60; using namespace std; // 負の数にも対応したmod // inline long long mod(long long a, long long m) { return (a % m + m) % m; } // ab + bq = gcd(a, b)となる(p, q)を求めて,d = gcd(a, b) をリターンする long long extgcd(long long a, long long b, long long& x, long long& y) { long long d = a; if (b != 0) { d = extgcd(b, a % b, y, x); y -= (a / b) * x; } else { x = 1; y = 0; } return d; } // 中国剰余定理 // リターン値を(r, m)とすると解は x ≡ r (mod. m) // 解ナシの場合は(0, -1)をリターン // 2元 pair<long long, long long> chineserem(long long b1, long long m1, long long b2, long long m2) { long long p, q; long long d = extgcd(m1, m2, p, q); if ((b2 - b1)%d != 0) return make_pair(0, -1); long long m = m1 * (m2/d); long long tmp = (b2 - b1) / d * p % (m2/d); long long r = mod(b1 + m1 * tmp, m); return make_pair(r, m); } pair<long long, long long> chineserem(const vector<long long> &b, const vector<long long> &m) { long long r = 0, M = 1; for (int i = 0; i < b.size(); ++i) { long long p, q; long long d = extgcd(M, m[i], p, q); if ((b[i] - r) % d != 0) return make_pair(0, -1); long long tmp = (b[i] - r) / d * p % (m[i]/d); r += M * tmp; M *= m[i]/d; } return make_pair(mod(r, M), M); } // 逆元 // (a, m)が互いに素 long long modinv(long long a, long long m) { long long x, y; extgcd(a, m, x, y); return mod(x, m); } // mは互いに素でなければいけない long long garner(vector<long long> b, vector<long long> m, long long MOD) { m.push_back(MOD); vector<long long> coeffs((int)m.size(), 1); vector<long long> constants((int)m.size(), 0); for (int k = 0; k < b.size(); ++k) { long long t = mod((b[k] - constants[k]) * modinv(coeffs[k], m[k]), m[k]); for (int i = k+1; i<m.size(); ++i) { (constants[i] += t * coeffs[i]) %= m[i]; (coeffs[i] *= m[k]) %= m[i]; } } return constants.back(); } long long gcd(long long a, long long b) { if (b == 0) return a; else return gcd(b, a%b); } // m[i]のlcmが帰る(?) long long pregarner(vector<long long> &b, vector<long long> &m, long long MOD) { long long res = 1; for (int i = 0; i < b.size(); ++i) { for (int j = 0; j < i; ++j) { long long g = gcd(m[i], m[j]); if ((b[i] - b[j])% g != 0) return -1; m[i] /= g; m[j] /= g; long long gi = gcd(m[i], g), gj = g/gi; do { g = gcd(gi, gj); gi *= g; gj /= g; } while (g != 1); m[i] *= gi; m[j] *= gj; b[i] %= m[i]; b[j] %= m[j]; } } for (int i = 0; i < b.size(); ++i) (res *= m[i]) %= MOD; return res; } int main() { int N; cin >> N; vector<ll> x(N), y(N); bool nonzero = false; rep(i, N) { cin >> x[i] >> y[i]; if (x[i] > 0) nonzero = true; } ll lcm = pregarner(x, y, 1e9+7); if (!nonzero) cout << lcm << endl; else if (lcm == -1) cout << -1 << endl; else cout << garner(x, y, 1e9+7) << endl; }