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);(上不变,下递增)。

 

posted @   80k  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示