int c, r;
ll val;
for(c = 1, r = 1; c <= n; ++ c){
int tmp = r;
for(int i = r; i <= n; ++ i){
if(a[i][c]){
tmp = i;
}
}
if(!a[tmp][c]){
continue;
}
swap(a[tmp], a[r]);
swap(b[tmp], b[r]);
val = inv(a[r][c]);
for(int i = 1; i <= n; ++ i){
a[r][i] = a[r][i] * val % P;
b[r][i] = b[r][i] * val % P;
}
for(int i = 1; i <= n; ++ i){
if(i != c){
val = a[i][c];
for(int j = 1; j <= n; ++ j){
a[i][j] = (a[i][j] - a[r][j] * val % P + P) % P;
b[i][j] = (b[i][j] - b[r][j] * val % P + P) % P;
}
}
}
++ r;
}
//here******
return r <= n;
}
如果是正常的高斯消元,到了这一步 a 应该变为了对角线全是1的阶梯矩阵,还需从下往上带回,那为什么矩阵求逆时这里就直接变成了单位矩阵呢