几个小时前写出来了这题,发现 WA,然后对着题解看了两个多小时也没有发现任何问题/kk
所以有没有愿意把我的代码与题解的对照一下或者一眼妙出错误啊/kel
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100005,maxm=100005,mod=998244353;
const int inf=(1000000000000000000)%998244353;
int read(){
int s=0,w=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') w=-w;ch=getchar();}
while (ch>='0'&&ch<='9'){s=(s*10+(ch^'0'));ch=getchar();}
return s*w;
}
int n,m,cnt,ans;
int head[maxn],tmp[3][maxn],ducati[3][maxn],maxv[3],p[maxn];
struct edge{int nxt,to;}e[maxm];
void add_edge(int u,int v){
cnt++;
e[cnt].to=v,e[cnt].nxt=head[u],head[u]=cnt;
}
signed main(){
n=read();
p[0]=1;
for (int i=1;i<=n;i++) p[i]=(p[i-1]*inf)%mod;
for (int f=0;f<3;f++){
m=read(),cnt=0;
for (int i=1;i<=n;i++) head[i]=0;
for (int i=1;i<=m;i++){
int u=read(),v=read();
if (u>v) swap(u,v);
add_edge(u,v);
}
for (int now=n;now>=1;now--){
set<int> s;
for (int i=head[now];i;i=e[i].nxt) s.insert(tmp[f][e[i].to]);
while (s.count(tmp[f][now])) tmp[f][now]++;
}
for (int i=1;i<=n;i++){
ducati[f][tmp[f][i]]=(ducati[f][tmp[f][i]]+p[i])%mod;
maxv[f]=max(maxv[f],tmp[f][i]);
}
}
for (int i=0;i<=maxv[1];i++){
for (int j=0;j<=maxv[2];j++){
int k=(i^j);
int cur=(ducati[0][i]*ducati[1][j])%mod;
cur=(cur*ducati[2][k])%mod;
ans=(ans+cur)%mod;
}
}
cout<<ans<<endl;
return 0;
}