AcWing 算法基础课 高斯消元、组合数
一、高斯消元
对矩阵n*n*x=列向量n
枚举每一列(c+,r)
1、找到当前列绝对值最大的行(如果为0则下一列)
2、将当前行与1、中的行的元素交换
3、将当前行的当前列元素化为1
4、利用当前行的元素,将后面行的当前列的元素化为0(先枚举后面的行,后面的行的当前列元素不为0,则每个列都消)
5、r++
r 若出现0=非0的行,无解 否则,无穷多解 消去上三角的其他部分(从后往前遍历行,每次遍历用后面的行减) r==n 唯一解 二、组合数 1、利用递推式,预处理出所有可能的组合数,适用于数值比较小但查询次数多。(a<2000),O(n^2) C(a,b)=C(a-1,b)+C(a-1,b-1)(从实际意义出发可得公式) 边界情况(j==0)时,C(i,j)为1 共计预处理出a*a个数 2、C(a,b)=a!/(b!(a-b)!),可以预处理出全部a!的值,适用于数值适中且查询次数多。(a<10^5),O(nlogn),logn在求逆元时出现 共计预处理出a个数 注意,除法计算后取模,不等于同时将上下取模,需要利用求逆元的方式,转换成乘法。 3、卢卡斯定理,适用于询问少但是数据范围很大题目,O(p*logn*logp),p为结果取余的除数,需要a或b>p C(a,b)=C(a%p,b%p)*C(a/p,b/p) (mod p) 4、一次询问,不取模,结果会很大,需要用高精度算法 对C(a,b)=a!/(b!(a-b)!)进行分解质因数。 a!中质因子p的个数为[a/p]+[a/p^2]+[a/p^3]+... 得到a!/(b!(a-b)!)的质因子后,利用高精度乘法求解