結果
問題 | No.389 ロジックパズルの組み合わせ |
ユーザー |
|
提出日時 | 2016-07-10 18:12:59 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 125 ms / 2,000 ms |
コード長 | 1,123 bytes |
コンパイル時間 | 114 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 18,392 KB |
最終ジャッジ日時 | 2024-10-13 10:26:33 |
合計ジャッジ時間 | 6,604 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 99 |
ソースコード
M = int(input()) Hs = list(map(int, input().split())) 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_mod_p(n, b, mod): ''' nCb % mod を返す。 mod が素数で、mod > n のときのみ有効。 ''' 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 solve(M, Hs): if sum(Hs) == 0: return 1 mod = 10**9 + 7 n = len(Hs) minM = sum(Hs) + n - 1 if M < minM: return 'NA' if M == minM: return 1 r = M - minM return nCb_mod_p(n + r, r, mod) print(solve(M, Hs))