文章目录
- 中国剩余定理
- 高斯消元
一、中国剩余定理(求一组同余方程的解x)
1.core idea:
2.代码如下:
LL exgcd(LL a,LL b,LL &x,LL &y){//求乘法逆元(转化为不定方程+求不定方程的解(扩欧几里得算法、(x%m+m)%m))
if(b==0){x=1, y=0; return a;}
LL d, x1, y1;
d = exgcd(b, a%b, x1, y1);
x = y1, y = x1-a/b*y1;
return d;
}
LL CRT(LL m[], LL r[]){//中国剩余定理
LL M = 1, ans = 0;
for(int i=1;i<=n;i++) M*=m[i];
---------------------------------
for(int i=1; i<=n; i++){
LL c = M/m[i];
----------------------
LL x,y;
exgcd(c, m[i], x, y);//求c的乘法逆元x
----------------------
ans = (ans+r[i]*c*x%M)%M;
}
return (ans%M + M)%M;
}
exgcd(c, m[i], x, y) 函数调用后,变量 x 就是 c 关于 mi的乘法逆元。这是因为 exgcd 函数求解的是 c 和 mi的最大公约数,以及满足 cx+miy=gcd(c,mi) 的整数 x 和 y。由于 c 和 mi 互质,它们的最大公约数为 1,因此 cx+miy=1,这表明 x 是 c 关于 mi 的乘法逆元。
为了确保 x 是一个有效的模 mi下的逆元,我们需要将其调整到 0 到 mi−1 的范围内。因此,代码中使用了 x % M 来确保 x 是一个非负整数。
时间复杂度为O(nlogc)
二、高斯消元(求线性方程组的解x1,x2,x3...xn)
1.线性方程组
2.高斯消元法
core idea: 1.枚举对角线上的主元()2.如果该主元为0,找该位置下面不为0的一行,去交换 3.把该主元变成1(同时对这一行操作)4.把该主元这一列都变成0(主元+-*/?,再把这个结果加到这一列的那个数;.....;...),会带着这一整行发生变化 5.每个主元都操作完后,再从下到上回代求解
演示操作:
3.代码如下:
bool gauss(){
for(int i=1; i<=n; i++){ //枚举行列
int r = i;
for(int k=i; k<=n; k++) //找非0行
if(fabs(a[k][i])>eps)
{r = k; break;}
if(r!=i) swap(a[r],a[i]); //换行
if(fabs(a[i][i])<eps) return 0;
for(int j=n+1; j>=i; j--) //变1
a[i][j] /= a[i][i];
for(int k=i+1; k<=n; k++) //变0
for(int j=n+1; j>=i; j--)
a[k][j] -= a[k][i]*a[i][j];
}
for(int i=n-1; i>=1; i--) //回代
for(int j=i+1; j<=n; j++)
a[i][n+1] -= a[i][j]*a[j][n+1];
return 1; //存在唯一解
}
a[i][n+1] 被更新为第 i 个变量的解。因此,矩阵的最后一列包含了方程组的解。