結果

問題 No.125 悪の花弁
ユーザー rpy3cpprpy3cpp
提出日時 2015-11-16 01:08:31
言語 Python3
(3.11.6 + numpy 1.26.0 + scipy 1.11.3)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,392 bytes
コンパイル時間 1,132 ms
コンパイル使用メモリ 11,068 KB
実行使用メモリ 89,424 KB
最終ジャッジ日時 2023-10-11 16:44:36
合計ジャッジ時間 3,488 ms
ジャッジサーバーID
(参考情報)
judge11 / judge13
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

import fractions  # fractions.gcd を使う。なお、Python 3.5 から、gcd は、math パッケージに移行している。
import functools


def inv(n, mod):
    ''' mod を法とした n の逆元 ret を返す
    (n * ret) % mod = 1 となる 
    '''
    b = bin(mod-2)[2:][-1::-1]
    ret = 1
    tmp = n % mod
    if b[0] == '1':
        ret = n % mod
    for bi in b[1:]:
        tmp *= tmp
        tmp %= mod
        if bi == '1':
            ret *= tmp
            ret %= mod
    return ret


def init_factorials(N, mod):
    f = 1
    fac = [1] * (N + 1)
    for i in range(1, N + 1):
        f *= i
        f %= mod
        fac[i] = f
    return fac


def init_invfac(N, mod, fac):
    ret = inv(fac[N], mod)
    invfac = [1] * (N + 1)
    invfac[N] = ret
    for i in range(N-1, 0, -1):
        ret *= i + 1
        ret %= mod
        invfac[i] = ret
    return invfac


def read_data():
    K = int(input())
    Cs = list(map(int, input().split()))
    return K, Cs


def solve(K, Cs):
    N = sum(Cs)
    mod = 10**9 + 7
    fac = init_factorials(N, mod)
    invfac = init_invfac(N, mod, fac)
    div = functools.reduce(fractions.gcd, Cs)
    divs = find_divs(div)
    ans = calc(N, divs, Cs, fac, invfac, mod)
    return ans


def find_divs(div):
    ''' div の約数(div, 1 を含む)の降順のリストを返す
    '''
    divs_small = []
    divs_large = []
    t = int(div ** 0.5)
    for c in range(1, t + 1):
        if div % c:
            continue
        divs_small.append(c)
        divs_large.append(div // c)
    if t * t == div:
        del divs_small[-1]
    divs_large.extend(divs_small[::-1])
    return divs_large


def calc(N, divs, Cs, fac, invfac, mod):
    gs = calc_gs(N, divs, Cs, fac, invfac, mod)
    hs = calc_hs(divs, gs, mod)
    return sum(h * inv(N//d, mod) for h, d in zip(hs, divs)) % mod

def calc_gs(N, divs, Cs, fac, invfac, mod):
    gs = []
    for d in divs:
        g = fac[N//d]
        for c in Cs:
            g *= invfac[c//d]
            g %= mod
        gs.append(g)
    return gs

def calc_hs(divs, gs, mod):
    hs = []
    for di, gi in zip(divs, gs):
        h = gi
        for dj, hj in zip(divs, hs):
            if di == dj:
                break
            if dj % di:
                continue
            h -= hj
            h %= mod
        hs.append(h)
    return hs


K, Cs = read_data()
print(solve(K, Cs))
0