只过了样例。
应该是系数矩阵炸了,但是我感觉我的 bfs 也没问题吧。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=610;
int mod,rd[N],cd[N];
vector<int>G[N],st,ed;
LL d[N];int v[N];
void bfs(int st){
memset(d,0,sizeof(d));d[st]=1;
memset(v,0,sizeof(v));v[st]=1;
queue<int>Q;Q.push(st);
while(!Q.empty()){
int x=Q.front();Q.pop();
for(int y:G[x]){
d[y]=(d[y]+d[x])%mod;
if(!v[y]){
v[y]=1;
Q.push(y);
}
}
v[x]=0;
}
}
LL a[N][N];
LL qpow(LL a,LL b){
LL ans=1%mod;a%=mod;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;b>>=1;
}
return ans;
}
LL gauss(LL n){
LL ans=1;int k;
for(int i=1;i<=n;i++){
for(k=i;k<=n;k++){
if(a[k][i]){
swap(a[k],a[i]);
if(i!=k)ans=-ans;
break;
}
}
if(!a[i][i])return 0;
for(k=i+1;k<=n;k++){
if(k!=i){
LL tmp=a[k][i]*qpow(a[i][i],mod-2)%mod;
for(int j=i;j<=n;j++){
a[k][j]=(a[k][j]-a[i][j]*tmp%mod+mod)%mod;
}
}
}
ans=ans*a[i][i]%mod;
}
return (ans+mod)%mod;
}
int main(){
int n,m;
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
G[x].push_back(y);
rd[y]++,cd[x]++;
}
for(int i=1;i<=n;i++){
if(!rd[i]){
st.push_back(i);
}
if(!cd[i]){
ed.push_back(i);
}
}
int cnt=st.size();
for(int i=0;i<st.size();i++){
bfs(st[i]);
for(int j=0;j<ed.size();j++){
a[i+1][j+1]=d[ed[j]];
}
}
printf("%lld\n",gauss(cnt));
return 0;
}