結果
問題 | No.187 中華風 (Hard) |
ユーザー | GOTKAKO |
提出日時 | 2024-03-22 02:23:56 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 116 ms / 3,000 ms |
コード長 | 1,882 bytes |
コンパイル時間 | 2,045 ms |
コンパイル使用メモリ | 206,408 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-09-30 10:27:59 |
合計ジャッジ時間 | 4,465 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,820 KB |
testcase_02 | AC | 102 ms
6,816 KB |
testcase_03 | AC | 100 ms
6,820 KB |
testcase_04 | AC | 114 ms
6,816 KB |
testcase_05 | AC | 115 ms
6,816 KB |
testcase_06 | AC | 116 ms
6,816 KB |
testcase_07 | AC | 115 ms
6,816 KB |
testcase_08 | AC | 105 ms
6,820 KB |
testcase_09 | AC | 103 ms
6,820 KB |
testcase_10 | AC | 104 ms
6,816 KB |
testcase_11 | AC | 115 ms
6,816 KB |
testcase_12 | AC | 114 ms
6,820 KB |
testcase_13 | AC | 66 ms
6,820 KB |
testcase_14 | AC | 56 ms
6,816 KB |
testcase_15 | AC | 93 ms
6,820 KB |
testcase_16 | AC | 93 ms
6,820 KB |
testcase_17 | AC | 2 ms
6,816 KB |
testcase_18 | AC | 2 ms
6,816 KB |
testcase_19 | AC | 1 ms
6,820 KB |
testcase_20 | AC | 87 ms
6,816 KB |
testcase_21 | AC | 2 ms
6,816 KB |
testcase_22 | AC | 114 ms
6,816 KB |
testcase_23 | AC | 1 ms
6,820 KB |
testcase_24 | AC | 1 ms
6,816 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; long long PreGarner(vector<long long> &B,vector<long long> &M,long long MOD){ long long ret = 1; for(int i=0; i<B.size(); i++) for(int k=i+1; k<B.size(); k++){ long long g = gcd(M.at(i),M.at(k)); if(B.at(i)%g != B.at(k)%g) return -1; M.at(i) /= g; M.at(k) /= g; long long g1 = gcd(M.at(i),g),g2 = g/g1; while(true){ g = gcd(g1,g2); if(g == 1) break; g1 *= g; g2 /= g; } M.at(i) *= g1,M.at(k) *= g2; B.at(i) %= M.at(i),B.at(k) %= M.at(k); } for(auto &m : M) ret = ret*m%MOD; return ret; //return lcm(m1,m2,...,mn). } long long extgcd(long long a, long long b, long long &x,long long &y){ if(b == 0){x = 1,y = 0; return a;} long long g = extgcd(b,a%b,y,x); y -= a/b*x; return g; } long long eazymod(long long a,long long m){return (a%m+m)%m;} long long findinv(long long a,long long m){ long long x,y; extgcd(a,m,x,y); return eazymod(x,m); } long long Garner(vector<long long> &B,vector<long long> &M,long long MOD){ M.push_back(MOD); vector<long long> mulM(M.size(),1),value(M.size(),0); for(int i=0; i<B.size(); i++){ long long t = eazymod((B.at(i)-value.at(i))*findinv(mulM.at(i),M.at(i)),M.at(i)); for(int k=i+1; k<M.size(); k++){ value.at(k) = (value.at(k)+t*mulM.at(k))%M.at(k); mulM.at(k) = mulM.at(k)*M.at(i)%M.at(k); } } return value.back(); } int main(){ int N; cin >> N; vector<long long> B,M; bool allzero = true; while(N--){ int b,m; cin >> b >> m; if(b) allzero = false; B.push_back(b); M.push_back(m); } long long mod = 1e9+7; long long lcm = PreGarner(B,M,mod); if(lcm == -1 || allzero) cout << lcm << endl; else cout << Garner(B,M,mod) << endl; }