[数学]Permutation&Combination


Permutation & Combination


ソートと組合せアルゴリズム
シーケンス:r個の순서대로の数を異なるnにリストする
組合せ:異なるnからr個の순서없이の数を選択する

オーダー


10枚のトランプから1、5、8枚のトランプを引く場合を想定します.순서없는 경우:1先抽,5先抽,순서있는 경우:1先取、5先取、8先取の場合を考慮します.

シーケンスサンプルコード

nPr : n (n - 1) (n - 2) * ... (n - r - 1)
#define MOD 1000000007

long long permutation(int n, int r){
    long long ans = 1;
    for(int i = n; i >= n - r - 1; i--){
        ans *= i;
        ans %= MOD;
    }
    return ans;
}

サンプルコードの組合せ

nCr : nPr / r!組合せの性質파스칼의 삼각형を利用して、注釈シーケンスを利用して、nCr = n-1Cr-1 + n-1Cr
#define MOD 1000000007
#define MAX 100000

long long combi[MAX][MAX];

void init(){
    combi[0][0] = 1;
    for(int i = 1; i <= MAX; i++){
        combi[i][0] = 1;
        for(int j = 1; j <= i; j++)    
            combi[i][j] = (combi[i - 1][j - 1] + combi[i - 1][j]) % MOD;
    }
}