BZOJ4894 矩阵外向树&&辗转相除消元

外向树需要把度数矩阵改成入度

因为取模,高斯消元要在整数下进行

有一种辗转相除消元法,可以不用求逆元,而且非常好写,复杂度\large n^3logn

最后求代数余子式的时候去掉的应该是根的那一行和那一列

#include
using namespace std;
typedef long long ll;
const ll N=310,M=1000000007;
ll a[N][N],n;
char g[N];
int main(){
	cin>>n;
    for(int i=1;i<=n;++i){
        scanf("%s",g+1);
        for(int j=1;j<=n;++j)
            if(g[j]=='1')a[i][j]--,a[j][j]++;
    }
    ll ans=1;
    for(int i=2;i<=n;++i)
        for(int j=i+1;j<=n;++j)
            while(a[j][i]){
                int t=a[i][i]/a[j][i];
                for(int k=i;k<=n;++k)a[i][k]=(a[i][k]-1ll*a[j][k]*t%M+M)%M,swap(a[i][k],a[j][k]);
                ans*=-1;
            }
    for(int i=2;i<=n;++i)ans=ans*a[i][i]%M;
    printf("%d\n",(ans+M)%M);
}

 

你可能感兴趣的:(数论,图论)