結果
問題 | No.186 中華風 (Easy) |
ユーザー | ate |
提出日時 | 2020-09-10 21:30:01 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,029 bytes |
コンパイル時間 | 763 ms |
コンパイル使用メモリ | 85,140 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-19 18:40:47 |
合計ジャッジ時間 | 1,514 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | AC | 1 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | AC | 2 ms
5,376 KB |
testcase_17 | AC | 2 ms
5,376 KB |
testcase_18 | AC | 2 ms
5,376 KB |
testcase_19 | AC | 2 ms
5,376 KB |
testcase_20 | AC | 1 ms
5,376 KB |
testcase_21 | AC | 2 ms
5,376 KB |
testcase_22 | AC | 2 ms
5,376 KB |
ソースコード
#include<iostream> #include<tuple> #include<cassert> #include<numeric> #include<utility> #include<vector> #include<algorithm> template<class T> std::tuple<T,T,T> ext_gcd(T a,T b){ if(b==0){ return {a,1,0}; } auto [d,y,x] = ext_gcd(b,a%b); y -= a/b * x; return {d,x,y}; } /* https://qiita.com/drken/items/ae02240cd1f8edfc86fd x \equiv b_1 (mod. m_1) x \equiv b_2 (mod. m_2) を満たす x が存在する必要十分条件は b_1 \equiv b_2 (mod. gcd(m_1,m_2)) これを満たす x が 0 <= x < lcm(m_1,m_2)に存在する x の構成方法 m_1*p + m_2*q = gcd(m_1,m_2) を満たす(p,q)をextended gcdより得る b_1 \equiv b_2 (mod. gcd(m_1,m_2))より、 (b_2-b_1) % gcd(m_1,_m2) == 0 d = gcd(m_1,m_2) s = (b_2-b_1)/d とおくと、 s*m_1*p + s*m_2*q = b_2-b_1 となる。ここで、 x = b_1+s*m_1*p = b_2-s*m_2*q とおくと、 x \equiv b_1 (mod. m_1) x \equiv b_2 (mod. m_2) が成り立つ */ template<class T> std::pair<T,T> crt1(T b1,T m1,T b2,T m2){ auto [d,p,q] = ext_gcd(m1,m2); if((b2-b1)%d)return {0,-1}; T lcm_m = m1/d*m2; T s = (b2-b1)/d; T x = b1+s*m1*p; return {x,lcm_m}; } template<class T> std::pair<T,T> crt(std::vector<T> const& b,std::vector<T> const& m){ assert(std::size(b)==std::size(m)); T r = 0, lcm_m = 1; for(int i=0;i<std::size(b);++i){ auto& b_i = b[i], m_i = m[i]; auto [d,p,q] = ext_gcd(lcm_m,m_i); if((b_i-r)%d)return {-1,-1}; T s = (b_i-r)/d; T tmp = s*p%(m_i/d); r += lcm_m*tmp; lcm_m *= m_i/d; } r = (r%lcm_m+lcm_m)%lcm_m; return {r,lcm_m}; } void solve(){ using namespace std; int n = 3; vector<int64_t> b(n),m(n); for(int i=0;i<n;++i)cin>>b[i]>>m[i]; if(std::all_of(std::begin(b),std::end(b),[](auto bi){return bi==0;})){ std::cout<< std::accumulate(std::begin(m),std::end(m),1ll,[](int64_t x,int64_t mi){return std::lcm(x,mi);}) <<std::endl; return ; } auto [x,mod] = crt(b,m); cout<<x<<endl; } int main(){ int t = 1; while(t--){ solve(); } }