组合数学 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; }