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;
}