关于矩阵树消元的写法
查看原帖
关于矩阵树消元的写法
119261
7KByte楼主2021/2/24 16:30

Rt。这道题这么写会挂,求原因。

如果不是多项式而是数的情况不会挂。

	n--;
	rep(i,1,n)rep(j,i+1,n)
		if(a[j][i].y){
		node cur=a[i][i]/a[j][i];
		rep(k,i,n)a[i][k]=a[i][k]-(cur*a[j][k]);
		swap(a[i],a[j]);op*=-1;
	}

完整代码

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 35
#define M 905
#define P 998244353
#define int long long 
using namespace std;
int n,m,u[M],v[M],w[M],mx,fa[N],ed;
int get(int x){return fa[x]==x?x:fa[x]=get(fa[x]);}
int Pow(int x,int y){
	int now=1;
	for(;y;y>>=1,x=x*x%P)if(y&1)now=now*x%P;
	return now;
}
struct node{
	int x,y;
	node(int X=0,int Y=0){x=X;y=Y;}
}a[N][N];
node operator+(node x,node y){
	node now;now.x=(x.x+y.x)%P;now.y=(x.y+y.y)%P;return now;
}
node operator-(node x,node y){
	node now;now.x=(x.x-y.x)%P;now.y=(x.y-y.y)%P;return now;
}
node operator*(node x,node y){
	node now;
	now.x=(x.x*y.y+x.y*y.x)%P;
	now.y=(x.y*y.y)%P;
	return now;
}
node operator/(node x,node y){
	node now;
	int inv=Pow(y.y,P-2);
	now.y=x.y*inv%P;now.x=(x.x*y.y-x.y*y.x)%P*inv%P*inv%P;
	return now;
}
int phi(int x){
	int now=x;
	for(int i=2;i*i<=x;i++)if(x%i==0){
		now=now/i*(i-1);
		while(x%i==0)x/=i;
	}
	if(x>1)now=now/x*(x-1);
	return now;
}
void calc(int x){
	rep(i,1,n)fa[i]=i;
	int cnt=n;
	rep(i,1,m)if(w[i]%x==0&&get(u[i])!=get(v[i]))fa[get(u[i])]=get(v[i]),cnt--;
	if(cnt!=1)return;
	rep(i,1,n)rep(j,1,n)a[i][j]=node(0,0);
	rep(i,1,m){
		node cur;
		if(w[i]%x)cur=node(0,0);else cur=node(w[i],1);
		a[u[i]][v[i]]=a[u[i]][v[i]]-cur;a[v[i]][u[i]]=a[v[i]][u[i]]-cur;
		a[u[i]][u[i]]=a[u[i]][u[i]]+cur;a[v[i]][v[i]]=a[v[i]][v[i]]+cur;
	}
	node ans(0,1);int op=1;
	n--;
	rep(i,1,n)rep(j,i+1,n)
		if(a[j][i].y){
		node cur=a[i][i]/a[j][i];
		rep(k,i,n)a[i][k]=a[i][k]-(cur*a[j][k]);
		swap(a[i],a[j]);op*=-1;
	}
	rep(i,1,n)ans=ans*a[i][i];n++;
	ed=(ed+op*ans.x%P*phi(x)%P)%P;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	rep(i,1,m)scanf("%lld%lld%lld",&u[i],&v[i],&w[i]),mx=max(mx,w[i]);
	rep(i,1,mx)calc(i);
	printf("%lld\n",(ed+P)%P);
	return 0;
} 
2021/2/24 16:30
加载中...