矩阵求逆的核心代码貌似就是高斯消元
高斯消元的核心代码
for(int i=1;i<=n;i++){
p=i;
for(int j=i;j<=n;j++) if(a[j][i]>a[p][i]) p=j;
if(!a[p][i]){cout<<"No Solution"<<endl; return 0;}
for(int k=1;k<=n+1;k++) swap(a[i][k],a[p][k]);
double b=a[i][i];
//此处系数化1
for(int k=1;k<=n+1;k++) a[i][k]/=b;
//此次处理其他式子
for(int j=1;j<=n;j++) if(j!=i){
double c=a[j][i];
for(int k=1;k<=n+1;k++)
a[j][k]-=c*a[i][k];
}
}
矩阵求逆的核心代码
for(int i=1;i<=n;i++){
int pl=i;
for(int j=i+1;j<=n;++j)
if(a[j][i]>a[pl][i]) pl=j;
swap(a[i],a[pl]);
if(!a[i][i]){ cout<<"No Solution"<<endl; return 0; }
ll kk=f_pow(a[i][i],mod-2);
for(int j=1;j<=n;j++) if(i!=j) {
int p=a[j][i]*kk%mod;
//此处处理其他行
for(int k=1;k<=2*n;k++)
//此处不同
a[j][k]=(a[j][k]-p*a[i][k]%mod+mod)%mod;
}
//此处系数化1
for(int k=1;k<=2*n;k++) a[i][k]=a[i][k]*kk%mod;
}
为什么系数化1放到了后面呢
这样写
for(int i=1;i<=n;i++){
int pl=i;
for(int j=i+1;j<=n;++j)
if(a[j][i]>a[pl][i]) pl=j;
swap(a[i],a[pl]);
if(!a[i][i]){ cout<<"No Solution"<<endl; return 0; }
ll kk=f_pow(a[i][i],mod-2);
//此处系数化1
for(int k=1;k<=2*n;k++) a[i][k]=a[i][k]*kk%mod;
for(int j=1;j<=n;j++) if(i!=j) {
int p=a[j][i]%mod;
//此处处理其他行
for(int k=1;k<=2*n;k++)
//此处不同
a[j][k]=(a[j][k]-p*a[i][k]%mod+mod)%mod;
}
}
这样写为什么是错的呢
求大佬解答喵