高斯消元(行列式)

浮点高斯消元:

int gsxy(int n,int m)
{
    int i=1;
    for(int j=1;i<=n && j<=m;j++)
    {
        int x=i;
        for(int k=i+1;k<=n;k++)
            if(!zero(a[k][j]) && fabs(a[k][j])>fabs(a[x][j]))
               x=k;
        if(zero(a[x][j]))continue;
        for(int k=j;k<=m;k++)
            swap(a[i][k],a[x][k]);
        for(int k=1;k<=n;k++)
        {
            if(k==i || zero(a[k][j]))continue;
            double f=a[k][j]/a[i][j];
            for(int l=j;l<=m;l++)
                a[k][l]-=a[i][l]*f;
        }
        for(int k=m;k>=j;k--)
            a[i][k]/=a[i][j];
        i++;
    }
    return i-1;
}

模意义下高斯消元

int gsxy(int n,int m)
{
    int i=1;
    for(int j=1;i<=n && j<=m;++j)
    {
        int x=i;
        for(int k=i+1;k<=n;++k)
            if(a[k][j] && abs(a[k][j])>abs(a[x][j]))
               x=k;
        if(!a[x][j])continue;
        for(int k=j;k<=m;++k)
            swap(a[i][k],a[x][k]);
        for(int k=1;k<=n;++k)
        {
            if(k==i || !a[k][j])continue;
            ll f=a[k][j]*qpow(a[i][j],mod-2)%mod;
            for(int l=j;l<=m;++l)
            {
                a[k][l]-=a[i][l]*f%mod;
                if(a[k][l]<=-mod)a[k][l]%=mod;
                if(a[k][l]<0)a[k][l]+=mod;
            }
        }
        for(int k=m;k>=j;--k)
            (a[i][k]*=qpow(a[i][j],mod-2))%=mod;
        ++i;
    }
    return i-1;
}

整数行列式求值:

ll a[205][205],mod;

ll det(int n)
{
    ll ans=1,f=1;
    for(int i=1; i<=n; i++)
    {
        for(int j=i+1; j<=n; j++)
        {
            int x=i,y=j;
            while(a[y][i])
            {
                ll t=a[x][i]/a[y][i];
                for(int k=i; k<=n; k++)
                    a[x][k]=(a[x][k]-a[y][k]*t%mod)%mod;
                swap(x,y);
            }
            if(x!=i)
            {
                for(int k=1; k<=n; k++)
                    swap(a[i][k],a[j][k]);
                f=-f;
            }
        }
        ans=ans*a[i][i]%mod;
    }
    return (ans*f+mod)%mod;
}

异或消元:

int xorxy(int n,int m)
{
    int i=1;
    for(int j=1; i<=n && j<=m; j++)
    {
        int x=0;
        for(int k=i; k<=n; k++)
            if(b[k][j])
            {
                x=k;
                break;
            }
        if(!x)continue;
        for(int k=j;k<=m;k++)
            swap(b[i][k],b[x][k]);
        for(int k=1;k<=n;k++)
        {
            if(k==i || !b[k][j])continue;
            for(int l=j;l<=m;l++)
                b[k][l]^=b[i][l];
        }
        i++;
    }
    return i-1;
}

你可能感兴趣的:(高斯消元(行列式))