排列数 A(n,m)=m!/(m-n)!
组合数 C(n,m)=m!/(n!*(m-n)!)
组合数在小数据量时有O(n)
long long res=1;
for(long long i=m,j=1; j<=n; ++j,--i)res=res*i/j;
但当数据量稍大时,一取模结果就会出错
所以要用杨辉三角递推O(n^2)
vector<vector<int>>C;
C.assign(m+1,vector<int>(m+1));
for(int i=0; i<=m; i++) {
C[i][0]=1;
for(int j=1; j<=i; j++) {
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
//此时取模不影响结果
}
}
C(0,0)
C(1,0) C(1,1)
C(2,0) C(2,1) C(2,2)
C(3,0) C(3,1) C(3,2) C(3,3)
对应杨辉三角
1
1 1
1 2 1
1 3 3 1
此外还可以用乘法逆元O(n)求解组合数
不会!
m*n矩阵从左上到右下
不同路径总数:
ll res=1;
for(ll i=m,j=1;j<n;i++,j++)res=res*i/j;
return res;