結果

問題 No.187 中華風 (Hard)
ユーザー OrisanoOrisano
提出日時 2015-11-23 01:03:17
言語 PyPy2
(7.3.15)
結果
AC  
実行時間 548 ms / 3,000 ms
コード長 2,109 bytes
コンパイル時間 1,000 ms
コンパイル使用メモリ 77,352 KB
実行使用メモリ 87,632 KB
最終ジャッジ日時 2023-10-11 18:17:08
合計ジャッジ時間 10,085 ms
ジャッジサーバーID
(参考情報)
judge12 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 101 ms
79,276 KB
testcase_01 AC 98 ms
79,076 KB
testcase_02 AC 484 ms
83,864 KB
testcase_03 AC 470 ms
84,248 KB
testcase_04 AC 512 ms
84,740 KB
testcase_05 AC 507 ms
84,528 KB
testcase_06 AC 496 ms
85,152 KB
testcase_07 AC 548 ms
87,632 KB
testcase_08 AC 450 ms
85,912 KB
testcase_09 AC 443 ms
85,772 KB
testcase_10 AC 444 ms
85,972 KB
testcase_11 AC 502 ms
85,576 KB
testcase_12 AC 508 ms
84,320 KB
testcase_13 AC 187 ms
80,764 KB
testcase_14 AC 204 ms
80,728 KB
testcase_15 AC 410 ms
80,528 KB
testcase_16 AC 439 ms
81,656 KB
testcase_17 AC 75 ms
76,300 KB
testcase_18 AC 92 ms
79,284 KB
testcase_19 AC 74 ms
76,596 KB
testcase_20 AC 416 ms
83,372 KB
testcase_21 AC 73 ms
76,524 KB
testcase_22 AC 501 ms
84,860 KB
testcase_23 AC 75 ms
76,560 KB
testcase_24 AC 74 ms
76,044 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#coding:utf-8
from __future__ import (
    absolute_import,
    division,
    print_function,
    unicode_literals,
)

def mod_inv(x, m):
    """
    a*x = 1 (mod m)
    return a
    """
    y, u, v = m, 1, 0
    while y:
        t = x // y
        x, y = y, x - t * y
        u, v = v, u - t * v
    return (u % m + m) % m


def factor(x):
    m = 2
    while m * m <= x:
        if x % m == 0:
            yield m
        while x % m == 0:
            x //= m
        m += 1
    if x > 1:
        yield x


def gcd(x, y):
    return gcd(y, x % y) if y else x


def f_lower(x, f):
    r = 1
    while x % f == 0:
        x //= f
        r *= f
    return r


def CRT_pre(eqs):
    N = len(eqs)
    for i in range(N):
        for j in range(i + 1, N):
            for p in factor(gcd(eqs[i][2], eqs[j][2])):
                fs = map(lambda x: f_lower(x[2], p), eqs)
                ma = max(fs)
                idx = fs.index(ma)
                for k in range(N):
                    if k == idx:
                        continue
                    if eqs[k][1] % fs[k] != eqs[idx][1] % fs[k]:
                        return False
                    eqs[k][2] //= fs[k]
                    eqs[k][1] %= eqs[k][2]
    return True


def CRT(eqs):
    """
    eqs = [(a,b,m), ...]
    ax = b (mod m)
    coprime a, m
    coprime m[i], m[j] if i != j
    >>> eqs = [(1, 32134, 1584891), (1, 193127, 3438478)]
    ... assert CRT(eqs) == (717283526504001097, 5449612835898), "CpawCTF Q26 Failed."
    """
    mod = reduce(lambda a,x: a*x[2], eqs, 1)
    m = map(lambda x: mod // x[2], eqs)
    c = map(lambda x: mod_inv(x[0][0] * x[1], x[0][2]), zip(eqs, m))
    return reduce(lambda a,x: a + x[0] * x[1] * x[2][1], zip(m, c, eqs), 0), mod


def main():
    MOD = 10 ** 9 + 7
    N = int(raw_input())
    eqs = [[1] + map(int, raw_input().split(" ")) for _ in range(N)]
    if not CRT_pre(eqs):
        print(-1)
    elif any(map(lambda x: x[1], eqs)):
        c, m = CRT(eqs)
        print((c % m) % MOD)
    else:
        print(reduce(lambda a,x: a*x[2], eqs, 1) % MOD)


if __name__ == "__main__":
    main()
0