結果

問題 No.117 組み合わせの数
ユーザー rpy3cpprpy3cpp
提出日時 2015-07-14 23:39:56
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,289 bytes
コンパイル時間 1,778 ms
コンパイル使用メモリ 86,868 KB
実行使用メモリ 80,988 KB
最終ジャッジ日時 2023-09-22 16:00:47
合計ジャッジ時間 12,784 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
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