AcWing 算法基础课 高斯消元、组合数
一、高斯消元
对矩阵n*n*x=列向量n
枚举每一列(c+,r)
1、找到当前列绝对值最大的行(如果为0则下一列)
2、将当前行与1、中的行的元素交换
3、将当前行的当前列元素化为1
4、利用当前行的元素,将后面行的当前列的元素化为0(先枚举后面的行,后面的行的当前列元素不为0,则每个列都消)
5、r++
r<n
若出现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)!)的质因子后,利用高精度乘法求解
组合数公式:
Σ(i=0~k)C(n+i,n)=C(n+k+1,n+1);(上不变,下递增)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人