結果

問題 No.187 中華風 (Hard)
ユーザー OrisanoOrisano
提出日時 2015-11-23 01:02:15
言語 Python2
(2.7.18)
結果
AC  
実行時間 1,559 ms / 3,000 ms
コード長 2,109 bytes
コンパイル時間 364 ms
コンパイル使用メモリ 6,688 KB
実行使用メモリ 10,164 KB
最終ジャッジ日時 2023-10-11 18:17:37
合計ジャッジ時間 21,835 ms
ジャッジサーバーID
(参考情報)
judge12 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 15 ms
6,108 KB
testcase_01 AC 15 ms
6,232 KB
testcase_02 AC 1,257 ms
8,740 KB
testcase_03 AC 1,171 ms
8,808 KB
testcase_04 AC 1,559 ms
10,084 KB
testcase_05 AC 1,535 ms
9,936 KB
testcase_06 AC 1,539 ms
10,056 KB
testcase_07 AC 1,543 ms
10,056 KB
testcase_08 AC 926 ms
10,044 KB
testcase_09 AC 920 ms
10,040 KB
testcase_10 AC 924 ms
10,112 KB
testcase_11 AC 1,542 ms
10,072 KB
testcase_12 AC 1,549 ms
10,164 KB
testcase_13 AC 270 ms
6,332 KB
testcase_14 AC 269 ms
6,284 KB
testcase_15 AC 1,126 ms
6,264 KB
testcase_16 AC 1,157 ms
6,164 KB
testcase_17 AC 11 ms
6,164 KB
testcase_18 AC 15 ms
6,084 KB
testcase_19 AC 11 ms
5,920 KB
testcase_20 AC 1,178 ms
9,068 KB
testcase_21 AC 11 ms
5,924 KB
testcase_22 AC 1,544 ms
10,128 KB
testcase_23 AC 12 ms
6,140 KB
testcase_24 AC 12 ms
6,024 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