結果

問題 No.117 組み合わせの数
ユーザー rpy3cpprpy3cpp
提出日時 2015-07-14 23:38:47
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
TLE  
実行時間 -
コード長 1,289 bytes
コンパイル時間 248 ms
コンパイル使用メモリ 12,544 KB
実行使用メモリ 15,744 KB
最終ジャッジ日時 2024-07-08 07:31:43
合計ジャッジ時間 12,851 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

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

ソースコード

diff #

def inv(a, m):
    ''' a * b = 1 (mod m) となる b を返す。 m は素数とする。
    b = a**(m-2) (mod m) となることが知られており、これを使って計算している。
    '''
    n = m - 2
    b = bin(n)[2:][-1::-1]
    ret = 1
    tmp = a
    if b[0] == '1':
        ret = a
    for bi in b[1:]:
        tmp *= tmp
        tmp %= m
        if bi == '1':
            ret *= tmp
            ret %= m
    return ret


def nCb(n, b, mod):
    ''' nCb % mod を返す。 mod が素数で、mod > n のときのみ有効。
    '''
    if b > n:
        return 0
    if b > n - b:
        b = n - b
    num = 1
    for k in range(n, n-b, -1):
        num *= k
        num %= mod
    den = 1
    for k in range(1, b+1):
        den *= k
        den %= mod
    r = inv(den, mod)
    return (num * r) % mod
    
def nPb(n, b, mod):
    if b > n:
        return 0
    num = 1
    for k in range(n, n-b, -1):
        num *= k
        num %= mod
    return num

def nHb(n, b, mod):
    return nCb(b+n-1, b, mod)


mod = 10**9 + 7
T = int(input())
for t in range(T):
    S = input()
    N, K = map(int, S[2:-1].split(','))
    op = S[0]
    if op == 'C':
        print(nCb(N, K, mod))
    elif op == 'P':
        print(nPb(N, K, mod))
    else:
        print(nHb(N, K, mod))
0