求行列式的值

原理:高斯消元 O(n^3)

代码:

ll determinant(int n)
{
    //a为方阵
    //mod根据实际情况而定
    ll ans=1;
    for(int k=1;k<=n;k++)
    {
        ll pos=-1;
        for(int i=k;i<=n;i++)
            if(a[i][k])
            {
                pos=i;
                break;
            }
        if(pos==-1)return 0;
        if(pos!=k)
            for(int j=k;j<=n;j++)swap(a[pos][j],a[k][j]);
        ll inv=mod_pow(a[k][k],mod-2,mod);
        for(int i=k+1;i<=n;i++)
            if(a[i][k])
            {
                ans=ans*inv%mod;
                for(int j=k+1;j<=n;j++)
                    a[i][j]=((a[i][j]*a[k][k]%mod-a[k][j]*a[i][k]%mod)%mod+mod)%mod;
                a[i][k]=0;
            }
    }
    for(int i=1;i<=n;i++)
        ans=ans*a[i][i]%mod;
    return ans;
}

 

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