僕の解答がなぜ間違いなのかわかりません。
まず、「中身の数が偶数個の袋」、「中身の数が奇数個の袋」の2グループに分けます。
(1) p == 0 のとき
- 偶数の袋を任意個、奇数の袋を偶数個選ぶ。
(2) p == 1 のとき
- 偶数の袋を任意個、奇数の袋を奇数個選ぶ。
いずれの場合でも、**「偶数の袋を選ぶ総数」 × 「奇数の袋を選ぶ総数」**が答えだと思っています。
この考え方を元にコードを書いたのですが、なぜ自分の解答が正解にならないのかわかりません。
難しい用語などは、自分で頑張って調べますので、ご回答よろしくお願いします。
Ruby
1# 組み合わせの数を計算する 2def binomial(n, r) 3 [r.times.inject(1) {|a, b| a * (n - b)} / Math.gamma(r + 1).to_i, 0].max 4end 5 6n, p_ = gets.split.map(&:to_i) 7 8a = gets.split.map(&:to_i) 9 10hash = a.group_by {|x| x % 2} 11hash[0] ||= [] 12hash[1] ||= [] 13 14len0 = hash[0].length 15len1 = hash[1].length 16 17# 「中身の数が偶数個」の袋の中から選ぶ組み合わせの総数 18sum_even = (0..len0).inject(0) {|r, v| r + binomial(len0, v)} 19case p_ 20when 0 21 # 「中身の数が奇数個」の袋を偶数個選ぶ組み合わせの総数 22 sum_odd = (0..len1).inject(0) {|r, v| 23 next r if v.odd? 24 r + binomial(len1, v) 25 } 26when 1 27 # 「中身の数が奇数個」の袋を奇数個選ぶ組み合わせの総数 28 sum_odd = (1..len1).inject(0) {|r, v| 29 next r if v.even? 30 r + binomial(len1, v) 31 } 32end 33 34puts sum_even * sum_odd 35
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/25 00:57