学习笔记 · 2026-07-31

【模板】高斯消元与行列式求值

高斯消元

struct gauss{
    double a[N][N],x[N];
    int work(){
        int p;
        double val;
        for(int i=1;i<=n;++i){
            p=-1;
            for(int j=i;j<=n;++j){
                if(a[j][i]!=0)p=j;
            }
            if(p==-1)return 0;
            val=a[p][i];
            for(int j=1;j<=n+1;++j){
                a[p][j]/=val;
            }
            swap(a[i],a[p]);
            for(int j=i+1;j<=n;++j){
                if(a[j][i]!=0){
                    val=a[j][i];
                    for(int k=1;k<=n+1;++k){
                        a[j][k]-=a[i][k]*val;
                    }
                }
            }
        }
        return 1;
    }
}f;

行列式

struct det{
    int a[N][N];
    void clear(){
        memset(a,0,sizeof(a));
    }
    int gauss(int n){
        int ret=1;
        for(int i=1;i<=n;++i){
            for(int j=i+1;j<=n;++j){
                while(a[i][i]){
                    int div=a[i][j]/a[i][i];
                    for(int k=1;k<=n;++k){
                        a[j][k]=(a[j][k]+mo-div*a[i][k])%mo;
                    }
                    swap(a[i],a[j]),ret=-ret;
                }
                swap(a[i],a[j]),ret=-ret;
            }
        }
        for(int i=1;i<=n;++i){
            ret=ret*a[i][i]%mo;
        }
        return (ret+mo)%mo;
    }
}f;