求助
查看原帖
求助
654281
reclusive楼主2023/11/7 11:09

只过了样例。

应该是系数矩阵炸了,但是我感觉我的 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;
}
2023/11/7 11:09
加载中...