矩阵树定理

· · 个人记录

其实也可以叫做行列式的板子。

变量

函数

代码

struct Matrix_Tree{
    ll *a[N],b[N][N];
    void init(int n){
        for(int i=1;i<=n;i++)a[i]=b[i];
        memset(b,0,sizeof(b));
    }
    ll det(int n){
        ll ans=1,f=1;
        for(int j=1;j<n;j++){
            for(int i=j;i<n;i++)
                if(a[i][j]){
                    if(i^j)
                        swap(a[i],a[j]),f*=-1;
                    break;
                }
            if(a[j][j]==0)return 0;
            ans=ans*a[j][j]%mod;
            ll t=qmi(a[j][j],mod-2);
            for(int k=j;k<n;k++)a[j][k]=a[j][k]*t%mod;
            for(int i=j+1;i<n;i++){
                t=mod-a[i][j];
                for(int k=j;k<n;k++)
                    a[i][k]=(a[i][k]+t*a[j][k]%mod)%mod;
            }
        }
        return (ans*f+mod)%mod;
    }
}tree;