题目描述:
雾.
题目分析:
前置技能可以看成 i->j 的单向边
跑一下1为根的矩阵树就好了
题目链接:
Ac 代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#define ll long long
const int mod=1e9+7;
const int maxm=310;
int n,m;
ll a[maxm][maxm];
inline ll Gauss()
{
ll ret=1;
for(int i=2;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
while(a[j][i])
{
ll t=a[i][i]/a[j][i];
for(int k=i;k<=n;k++) a[i][k]=(a[i][k]-a[j][k]*t)%mod;
for(int k=i;k<=n;k++) std::swap(a[i][k],a[j][k]);
ret=-ret;
}
if(!a[i][i]) return 0;
ret=(ret*a[i][i])%mod;
}
return (ret%mod+mod)%mod;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char s[350];
scanf("%s",s);
for(int j=1;j<=n;j++)
if(s[j-1]=='1') a[i][j]--,a[j][j]++;
}
printf("%lld\n",Gauss()%mod);
return 0;
}