组合数学 c(n,m)

复杂度O(min(k,n-k)^2)

#define LL long long 

LL gcd(LL a, LL b) {
    return b? gcd(b, a%b): a;
}
LL C(int n, int k) {
    vector<int> vn;
    k=min(n-k,k);
    for(int i=n-k+1; i<=n; ++i) {
        vn.push_back(i);
    }
    for(int i=2; i<=k; ++i) {
        int t = i;
        for(int j=0; j<vn.size(); ++j) {
            if(vn[j] != 1) {
                LL g = gcd(vn[j], t);
                t /= g;
                vn[j] /= g;
            }
        }
    }
    LL ret = 1;
    for(int j=0; j<vn.size(); ++j) {
        ret *= vn[j];
    }
    return ret;
}
posted @ 2012-05-12 22:23  HaoHua_Lee  阅读(206)  评论(0编辑  收藏  举报