ホームに戻る
nCr
// long long版 nCr (最大 50C50 まで)
long long nCr[51][51];
void init_nCr(){
memset(nCr, 0, sizeof(nCr));
nCr[0][0] = 1;
for(int i = 1; i <= 50; i++){
for(int j = 0; j <= 50; j++){
nCr[i][j] += nCr[i - 1][j];
if(j - 1 >= 0){
nCr[i][j] += nCr[i - 1][j - 1];
}
}
}
}
#define MAX_N 1001
// double版 nCr (最大 1000C1000 まで)
// メモ化していないので呼ぶ回数に注意
double nCr(int n,int r) {
static double C[MAX_N][MAX_N];
if(C[0][0]==0){
for(int i = 0; i < MAX_N; i++){
C[i][0]=C[i][i]=1;
}
for(int i = 1; i < MAX_N;i++){
for(int j =1; j < i; j++){
C[i][j]=(C[i-1][j-1]+C[i-1][j]);
}
}
}
if(n < 0 || n > MAX_N || r < 0 || r > n)return 0;
return C[n][r];
}