結果
| 問題 |
No.117 組み合わせの数
|
| ユーザー |
fmhr
|
| 提出日時 | 2016-09-10 09:13:30 |
| 言語 | Go (1.23.4) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,779 bytes |
| コンパイル時間 | 16,126 ms |
| コンパイル使用メモリ | 234,120 KB |
| 実行使用メモリ | 53,632 KB |
| 最終ジャッジ日時 | 2024-11-16 19:46:22 |
| 合計ジャッジ時間 | 26,877 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | TLE * 1 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
sc.Split(bufio.ScanWords)
T := nextInt()
for i := 0; i < T; i++ {
S := nextLine()
a, _ := strconv.Atoi(strings.Split(S[2:len(S)-1], ",")[0])
b, _ := strconv.Atoi(strings.Split(S[2:len(S)-1], ",")[1])
var ans int
initCombination()
switch S[0] {
case 'C':
ans = c(a, b)
case 'P':
ans = p(a, b)
case 'H':
ans = h(a, b)
}
fmt.Println(ans)
}
}
const MAX = 2000010
var MOD int = 1000000007 // 素数
var fact [MAX]int // 階乗
var inv [MAX]int
var factr [MAX]int // 階乗の逆元
func initCombination() {
inv[1], fact[0], factr[0] = 1, 1, 1
// nHkはn+k+1Ckとなるためn+kをとる
for i := 2; i < MAX; i++ {
inv[i] = inv[MOD%i] * (MOD - MOD/i) % MOD
}
for i := 1; i < MAX; i++ {
fact[i] = fact[i-1] * i % MOD
factr[i] = factr[i-1] * inv[i] % MOD
}
}
// 1 以上 N 以下の N 個の整数の中から,相異なる K 個の整数を選ぶパターンの数を C(N,K) と書きます.
func c(n, c int) int {
if c < 0 || c > n {
return 0
}
return factr[c] * fact[n] * factr[n-c] % MOD
}
// 1 以上 N 以下の N 個の整数の中から,相異なる K 個の整数を選び,順番に並べるパターンの数を P(N,K) と書きます.
func p(n, c int) int {
if c < 0 || c > n {
return 0
}
return fact[n] * factr[n-c] % MOD
}
// 1 以上 N 以下の N 個の整数の中から,重複を許して K 個の整数を選ぶパターンの数を H(N,K) と書きます.
func h(p, q int) int {
if p == 0 && q == 0 {
return 1
}
return c(p+q-1, q)
}
var sc = bufio.NewScanner(os.Stdin)
func nextLine() string {
sc.Scan()
return sc.Text()
}
func nextInt() int {
i, _ := strconv.Atoi(nextLine())
return i
}
fmhr