using System; using System.Collections.Generic; using System.Linq; class Program { static string InputPattern = "InputX"; static List GetInputList() { var WillReturn = new List(); if (InputPattern == "Input1") { WillReturn.Add("10 20"); WillReturn.Add("10 30"); WillReturn.Add("10 40"); //10 } else if (InputPattern == "Input2") { WillReturn.Add("10 20"); WillReturn.Add("10 30"); WillReturn.Add("30 40"); //70 } else if (InputPattern == "Input3") { WillReturn.Add("1 2"); WillReturn.Add("0 4"); WillReturn.Add("5 17"); //-1 } else if (InputPattern == "Input4") { WillReturn.Add("80712 221549"); WillReturn.Add("320302 699312"); WillReturn.Add("140367 496729"); //38774484298448350 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } static void Main() { List InputList = GetInputList(); long[] wkArr = { }; Action SplitAct = pStr => wkArr = pStr.Split(' ').Select(pX => long.Parse(pX)).ToArray(); var ModList = new List(); var DivList = new List(); SplitAct(InputList[0]); ModList.Add(wkArr[0]); DivList.Add(wkArr[1]); SplitAct(InputList[1]); ModList.Add(wkArr[0]); DivList.Add(wkArr[1]); SplitAct(InputList[2]); ModList.Add(wkArr[0]); DivList.Add(wkArr[1]); //var Result = CRT.ChineseRem(DivList, ModList); var Result = CRT.ChineseRem(ModList, DivList); if (Result.m == -1) { Console.WriteLine(-1); } else { Console.WriteLine(Result.r); } } } // 中国剰余定理クラス internal class CRT { // 負の数にも対応した mod // 例えば -17 を 5 で割った余りは本当は 3 (-17 ≡ 3 (mod. 5)) // しかし単に -17 % 5 では -2 になってしまう static long mod(long a, long m) { return (a % m + m) % m; } // 拡張 Euclid の互除法 // ap + bq = gcd(a, b) となる (p, q) を求め、d = gcd(a, b) をリターンします static long extGcd(long a, long b, ref long p, ref long q) { if (b == 0) { p = 1; q = 0; return a; } long d = extGcd(b, a % b, ref q, ref p); q -= a / b * p; return d; } internal struct CRT_Result_Def { internal long r; internal long m; } // 中国剰余定理 (2元の場合) // リターン値を (r, m) とすると解は x ≡ r (mod. m) // 解なしの場合は (0, -1) をリターン internal static CRT_Result_Def ChineseRem(long Div1, long Mod1, long Div2, long Mod2) { long p = 1, q = 0; long d = extGcd(Mod1, Mod2, ref p, ref q); // p is inv of m1/d (mod. m2/d) if ((Div2 - Div1) % d != 0) return new CRT_Result_Def() { r = 0, m = -1 }; long m = Mod1 * (Mod2 / d); // lcm of (m1, m2) long tmp = (Div2 - Div1) / d * p % (Mod2 / d); long r = mod(Div1 + Mod1 * tmp, m); return new CRT_Result_Def() { r = r, m = m }; } // 中国剰余定理 (n元の場合) // リターン値を (r, m) とすると解は x ≡ r (mod. m) // 解なしの場合は (0, -1) をリターン internal static CRT_Result_Def ChineseRem(List b, List m) { long r = 0, M = 1; for (int i = 0; i < b.Count; i++) { long p = 1, q = 0; long d = extGcd(M, m[i], ref p, ref q); // p is inv of M/d (mod. m[i]/d) if ((b[i] - r) % d != 0) { return new CRT_Result_Def() { r = 0, m = -1 }; } long tmp = (b[i] - r) / d * p % (m[i] / d); r += M * tmp; M *= m[i] / d; } return new CRT_Result_Def() { r = mod(r, M), m = M }; } /* // 中国剰余定理 // リターン値を (r, m) とすると解は x ≡ r (mod. m) // 解なしの場合は (0, -1) をリターン pair ChineseRem(const vector &b, const vector &m) { long long r = 0, M = 1; for (int i = 0; i < (int)b.size(); ++i) { long long p, q; long long d = extGcd(M, m[i], p, q); // p is inv of M/d (mod. m[i]/d) 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); } * * */ }