ホームに戻る
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];
}

inserted by FC2 system