結果
問題 | No.187 中華風 (Hard) |
ユーザー | keymoon |
提出日時 | 2020-09-08 19:06:37 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,806 bytes |
コンパイル時間 | 1,003 ms |
コンパイル使用メモリ | 112,848 KB |
実行使用メモリ | 29,356 KB |
最終ジャッジ日時 | 2024-05-07 11:34:58 |
合計ジャッジ時間 | 2,629 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 30 ms
27,300 KB |
testcase_01 | AC | 29 ms
25,388 KB |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | AC | 30 ms
27,300 KB |
testcase_14 | AC | 30 ms
25,132 KB |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | AC | 28 ms
25,136 KB |
testcase_18 | AC | 29 ms
24,876 KB |
testcase_19 | AC | 28 ms
25,012 KB |
testcase_20 | WA | - |
testcase_21 | AC | 28 ms
25,116 KB |
testcase_22 | WA | - |
testcase_23 | AC | 28 ms
25,132 KB |
testcase_24 | AC | 29 ms
27,280 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using AtCoder; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Numerics; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using static System.Math; public static class P { public static void Main() { int n = int.Parse(Console.ReadLine()); long[] r = new long[n]; long[] m = new long[n]; for (int i = 0; i < n; i++) { var xy = Console.ReadLine().Split().Select(int.Parse).ToArray(); r[i] = xy[0]; m[i] = xy[1]; } var (rem, mod) = AtCoder.Math.CRT(r, m); Console.WriteLine(mod == 0 ? -1 : rem % 1000000007); } } namespace AtCoder { using AtCoder.Internal; public static partial class Math { /// <summary> /// 同じ長さ n の配列 <paramref name="r"/>, <paramref name="m"/> について、x≡<paramref name="r"/>[i] (mod <paramref name="m"/>[i]),∀i∈{0,1,⋯,n−1} を解きます。 /// </summary> /// <remarks> /// <para>制約: |<paramref name="r"/>|=|<paramref name="m"/>|, 1≤<paramref name="m"/>[i], lcm(m[i]) が ll に収まる</para> /// <para>計算量: O(nloglcm(<paramref name="m"/>))</para> /// </remarks> /// <returns>答えは(存在するならば) y,z(0≤y<z=lcm(<paramref name="m"/>[i])) を用いて x≡y(mod z) の形で書ける。答えがない場合は(0,0)、n=0 の時は(0,1)、それ以外の場合は(y,z)。</returns> public static (long, long) CRT(long[] r, long[] m) { Debug.Assert(r.Length == m.Length); long r0 = 0, m0 = 1; for (int i = 0; i < m.Length; i++) { Debug.Assert(1 <= m[i]); long r1 = InternalMath.SafeMod(r[i], m[i]); long m1 = m[i]; if (m0 < m1) { (r0, r1) = (r1, r0); (m0, m1) = (m1, m0); } if (m0 % m1 == 0) { if (r0 % m1 != r1) return (0, 0); continue; } var (g, im) = InternalMath.InvGCD(m0, m1); long u1 = (m1 / g); if ((r1 - r0) % g != 0) return (0, 0); long x = (r1 - r0) / g % u1 * im % u1; r0 += x * m0; m0 *= u1; if (r0 < 0) r0 += m0; } return (r0, m0); } } } namespace AtCoder.Internal { public static partial class InternalMath { /// <summary> /// g=gcd(a,b),xa=g(mod b) となるような 0≤x<b/g の(g, x) /// </summary> /// <remarks> /// <para>制約: 1≤<paramref name="b"/></para> /// </remarks> public static (long, long) InvGCD(long a, long b) { a = SafeMod(a, b); if (a == 0) return (b, 0); long s = b, t = a; long m0 = 0, m1 = 1; long u; while (true) { if (t == 0) { if (m0 < 0) m0 += b / s; return (s, m0); } u = s / t; s -= t * u; m0 -= m1 * u; if (s == 0) { if (m1 < 0) m1 += b / t; return (t, m1); } u = t / s; t -= s * u; m1 -= m0 * u; } } public static long SafeMod(long x, long m) { x %= m; if (x < 0) x += m; return x; } } }