QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#689555 | #9530. A Game On Tree | bnxcvd | RE | 0ms | 0kb | C++14 | 3.2kb | 2024-10-30 17:43:33 | 2024-10-30 17:43:33 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef tuple<int, int, int> tii;
inline int rd() {
int x = 0;
bool f = 0;
char c = getchar();
for (; !isdigit(c); c = getchar()) f |= (c == '-');
for (; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return f ? -x : x;
}
#define eb emplace_back
#define all(s) (s).begin(), (s).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
const int maxn=1e5+10;
const int mod=998244353;
int n,dp[maxn][2],siz[maxn],ans[maxn],sp[maxn];
vector<int>G[maxn];
int qpow(int a,int b) {
int res=1;
while(b) {
if(b&1) res=1ll*res*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return res;
}
int inv(int a) {
return qpow(a,mod-2);
}
int dfs(int u,int fa) {
siz[u]=1;
vector<int>son,v1,v2,P;
for(auto v:G[u]) {
if(v==fa) continue;
dfs(v,u);
siz[u]+=siz[v];
}
int tot=0;
for(auto v:G[u]) {
if(v==fa) continue;
son.push_back(v);
int pos=1ll*(1ll*siz[v]*siz[v]%mod)*inv(1ll*siz[u]*siz[u]%mod)%mod;
int iu1,iu2;
iu1=1ll*pos*(dp[v][0]+1)%mod;
v1.push_back(iu1);
dp[u][0]=(dp[u][0]+iu1)%mod;
iu2=1ll*pos*((dp[v][1]+2ll*dp[v][0]%mod)%mod+1)%mod;
v2.push_back(iu2);
dp[u][1]=(dp[u][1]+iu2)%mod;
P.push_back(pos);
tot=(tot+pos)%mod;
}
for(int i=0;i<(int)v1.size();i++) {
ans[u]=(ans[u]+1ll*v2[i]*(tot-P[i]+mod)%mod)%mod;
ans[u]=(ans[u]+1ll*P[i]*(dp[u][1]-v2[i]+mod)%mod)%mod;
ans[u]=(ans[u]+2ll*v1[i]*(dp[u][0]-v1[i]+mod)%mod)%mod;
ans[u]=(ans[u]+1ll*v2[i]*(tot-P[i]+mod)%mod)%mod;
ans[u]=(ans[u]+1ll*P[i]*(dp[u][1]-v2[i]+mod)%mod)%mod;
ans[u]=(ans[u]+2ll*v1[i]*(dp[u][0]-v1[i]+mod)%mod)%mod;
int U=1ll*(siz[u]-siz[son[i]])*(siz[u]-siz[son[i]])%mod;
U=1ll*U*inv(1ll*siz[u]*siz[u]%mod)%mod;
ans[u]=(ans[u]+4ll*(((U-tot+P[i])%mod+mod)%mod)%mod*v2[i]%mod%mod)%mod;
sp[u]=(sp[u]+2ll*(siz[u]-siz[son[i]])%mod*inv(siz[u])%mod*v2[i]%mod)%mod;
}
}
int main() {
int T=rd();
while(T--) {
n=rd();
for(int i=1;i<=n;i++) {
siz[i]=0;
dp[i][0]=dp[i][1]=0;
G[i].clear();
ans[i]=0;
sp[i]=0;
}
for(int i=1,u,v;i<n;i++) {
u=rd();
v=rd();
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
int Ans=0;
for(int i=1;i<=n;i++){
ans[i]=1ll*ans[i]*siz[i]%mod*siz[i]%mod*siz[i]%mod*siz[i]%mod;
ans[i]=1ll*ans[i]*inv(1ll*n*n%mod*(n-1)%mod*(n-1)%mod)%mod;
Ans=(Ans+ans[i])%mod;
int res=1ll*sp[i]*siz[i]%mod*siz[i]%mod*siz[i]%mod*inv(1ll*n*n%mod*n%mod)%mod;
res=1ll*res*(n-siz[i])%mod*inv(1ll*n%mod)%mod;
res=4ll*res%mod*n%mod*n%mod*n%mod*n%mod;
res=1ll*res*inv(1ll*n*n%mod*(n-1)%mod*(n-1)%mod)%mod;
Ans=(Ans+res)%mod;
}
printf("%d\n",Ans);
}
return 0;
}
/*
2
3
1 2
2 3
5
1 2
1 5
3 2
4 2
*/
詳細信息
Test #1:
score: 0
Runtime Error
input:
2 3 1 2 2 3 5 1 2 1 5 3 2 4 2