結果

問題 No.187 中華風 (Hard)
ユーザー OrisanoOrisano
提出日時 2015-11-23 01:03:17
言語 PyPy2
(7.3.15)
結果
AC  
実行時間 521 ms / 3,000 ms
コード長 2,109 bytes
コンパイル時間 847 ms
コンパイル使用メモリ 76,956 KB
実行使用メモリ 83,360 KB
最終ジャッジ日時 2024-09-13 17:12:39
合計ジャッジ時間 9,702 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 94 ms
78,456 KB
testcase_01 AC 94 ms
78,088 KB
testcase_02 AC 435 ms
82,112 KB
testcase_03 AC 430 ms
82,424 KB
testcase_04 AC 476 ms
82,696 KB
testcase_05 AC 486 ms
82,920 KB
testcase_06 AC 488 ms
82,808 KB
testcase_07 AC 521 ms
83,360 KB
testcase_08 AC 427 ms
83,192 KB
testcase_09 AC 434 ms
83,248 KB
testcase_10 AC 418 ms
82,956 KB
testcase_11 AC 491 ms
82,748 KB
testcase_12 AC 482 ms
82,572 KB
testcase_13 AC 182 ms
79,352 KB
testcase_14 AC 187 ms
78,912 KB
testcase_15 AC 391 ms
79,004 KB
testcase_16 AC 422 ms
78,876 KB
testcase_17 AC 75 ms
75,708 KB
testcase_18 AC 90 ms
78,200 KB
testcase_19 AC 74 ms
75,524 KB
testcase_20 AC 405 ms
81,820 KB
testcase_21 AC 75 ms
75,508 KB
testcase_22 AC 489 ms
82,456 KB
testcase_23 AC 74 ms
75,272 KB
testcase_24 AC 75 ms
75,528 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