#はじめに
今回は、AtCoderコンテンツのABC132_D問題において、思案したもののWA(不正解)が覆らず、なぜ自分の実装では誤った出力になってしまうか、その根本的なところを解決したいと思い、投稿致しました。なお、問題に掲載されている入力例1、例2についてはクリアしています。
#問題文(引用)
引用ページ:https://atcoder.jp/contests/abc132/tasks/abc132_d
---引用始まり---
K 個の青いボールと N−K個の赤いボールがあります。同じ色のボールは区別が不可能です。すぬけ君と高橋君はこれらのボールで遊んでいます。
まず、すぬけ君が、N個のボールを左から右に一列に並べます。
次に、高橋君は、これらのうち K
個の青いボールのみを回収します。高橋君は、1 回の操作で連続して並ぶ青いボールを何個でも回収することができます。高橋君は、常に K個の青いボールを回収するのにかかる操作の回数が最小になるように行動します。
K個の青いボールを回収するために高橋君がちょうど i 回操作をする必要があるボールの並べ方は何通りあるでしょうか。 1≤i≤K をみたす i それぞれについて答えを計算し、10^9+7で割った余りを答えてください。
制約
1≤K≤N≤2000
入力
入力は以下の形式で標準入力から与えられる。
N K
出力
i行目 (1≤i≤K) に高橋君がちょうど i 回操作をする必要があるボールの並べ方の総数を 10^9+7 で割った余りを出力せよ。
---引用終わり---
#実装(WA判定)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
sc.close();
for(int i = 1;i <= K;i++) {
long combi1 = combination(N-K+1,i);
long combi2 = combination(K-1,i-1);
System.out.println(combi1*combi2%1_000_000_007);
}
}
public static long combination(int i,int j) {
if(j==0) {
return 1;
}
return combination(i-1,j-1)* i / j;
}
}
以上、ご指摘いただけますと嬉しいです。