组合数学模板

int anr(int n,int r) { //求n的r排列

    int res=1;

    for(int i=0;i<r;i++) res*= n-i;

    return res;

}

int cnr(int n,int r) { //求n的r组合

    int res = anr(n,r);

    for(;r;r--) res /= r;

    return res;

}

//{1,2,3,--,n}的r组合a[i](i=1 to r)在其所有r组合中的字典序号

int c_lexorder(int *a,int n,int r) {

    int res = cnr(n,r);

    for (int i = 0; i < r; ++i) {

        res -= cnr(n-a[i],r-i);

    }

}

 

你可能感兴趣的:(模板)