#include #include #include #include #include #include #include template std::tuple 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 std::pair 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 std::pair crt(std::vector const& b,std::vector const& m){ assert(std::size(b)==std::size(m)); T r = 0, lcm_m = 1; for(int i=0;i b(n),m(n); for(int i=0;i>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);}) <