compro-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ningenMe/compro-library

:warning: Combination - 二項係数
(lib/30-math/Combination.cpp)

Combination

コンストラクタ

メソッド

参考資料

Code

/*
 * @title Combination - 二項係数
 * @docs md/math/Combination.md
 */
template<class T> class Combination{
    vector<vector<T>> num;
public:
    //O(N^2)
    Combination(int N):num(N+1,vector<T>(N+1,(T)0)){
        num[0][0] = 1;
        for (int n = 1; n <= N; n++) {
            for (int k = 0; k <= n; k++) {
                num[n][k] = (num[n - 1][k]+(k?num[n - 1][k - 1]:0));
            }
        }
    }
    inline T binom(int n, int k) {
        return ((n < 0 || k < 0 || n < k) ? 0 : num[n][k]);
    }
    //nCk mod p (p is prime & p <= N)
    inline T lucas(int n, int k, long long p) {
        long long res=1;
        for(;n||k;n/=p,k/=p) (res *= num[n%p][k%p]) %= p;
        return res;
    }
};
#line 1 "lib/30-math/Combination.cpp"
/*
 * @title Combination - 二項係数
 * @docs md/math/Combination.md
 */
template<class T> class Combination{
    vector<vector<T>> num;
public:
    //O(N^2)
    Combination(int N):num(N+1,vector<T>(N+1,(T)0)){
        num[0][0] = 1;
        for (int n = 1; n <= N; n++) {
            for (int k = 0; k <= n; k++) {
                num[n][k] = (num[n - 1][k]+(k?num[n - 1][k - 1]:0));
            }
        }
    }
    inline T binom(int n, int k) {
        return ((n < 0 || k < 0 || n < k) ? 0 : num[n][k]);
    }
    //nCk mod p (p is prime & p <= N)
    inline T lucas(int n, int k, long long p) {
        long long res=1;
        for(;n||k;n/=p,k/=p) (res *= num[n%p][k%p]) %= p;
        return res;
    }
};
Back to top page