QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#688346 | #9530. A Game On Tree | doyo | WA | 0ms | 5712kb | C++20 | 2.9kb | 2024-10-30 06:08:54 | 2024-10-30 06:08:54 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,j,k) for(int i=j;i<=k;++i)
#define For(i,j,k) for(int i=j;i>=k;--i)
#define int long long
const int N = 1e5 + 111;
const int Mod = 998244353;
vector<int> e[N];
int ans;
int f[N],fl[N],fll[N],h[N],tmp[N];
int totsize[N];
int sz[N];
int totsize2[N];
int ksm(int x,int y){
int ans = 1;
while(y){
if(y&1) ans = ans * x % Mod;
y>>=1,x=x*x%Mod;
}
return ans;
}
int inv(int x){return ksm(x,Mod-2);}
void get_size(int x,int fa){
totsize[x] = 1;
totsize2[x] = 0;
for(auto nxt:e[x])if(nxt!=fa){
get_size(nxt,x);
totsize[x] += totsize[nxt];
totsize2[x] += totsize[nxt]*totsize[nxt];
}
}
void dfs(int x,int fa){
sz[x] = 1;
f[x] = 1;
int sz2 = 0;
for(auto nxt:e[x])if(nxt!=fa){
dfs(nxt,x);
int g = (f[nxt] + sz[nxt]*2);
int gl = fl[nxt] + f[nxt];
int gll = fll[nxt] + 2*fl[nxt] + f[nxt];
//和其它子树跨根贡献
ans += g * fll[x] + f[x] * gll + 2 * fl[x] * gl;
ans %= Mod;
ans = (ans - ((sz[x]-1)*(sz[x]-1)-sz2)*gll%Mod + Mod)%Mod;
//和其它子树非同在一起也有贡献
ans += ((totsize[x]-1-sz[nxt])*(totsize[x]-1-sz[nxt])-totsize2[x]+sz[nxt]*sz[nxt])*gll;
ans %= Mod;
//自己子树内一条到根x,一条不到根x的贡献
//自己内部那一条到x的可以连出去
// 意义有问题,h[x] += 的部分不应该乘以后面的,这是算到 ans 里的部分
// h[x] += (tmp[nxt] + h[nxt])%Mod * (totsize[x]-sz[nxt])%Mod,h[x] %= Mod;
ans += (tmp[nxt] + h[nxt])%Mod * (totsize[x]-sz[nxt])%Mod,h[x] %= Mod;
h[x] += (tmp[nxt] + h[nxt])%Mod,h[x] %= Mod;
f[x] += g;
f[x] += 2 * ((sz[x]-1) * sz[nxt]);//要求必须有一个在nxt中
f[x] %= Mod;
fl[x] += gl,fl[x] %= Mod;
fll[x] += gll,fll[x] %= Mod;
//tmp 计算一条往上延申,另一条不选择往上延申的方案数,要求两条都是过 x 点的
//用于下一步的计算
tmp[x] += gll * 2 * (totsize[x]-sz[nxt]);
tmp[x] %= Mod;
sz[x] += sz[nxt];
sz2 += sz[nxt] * sz[nxt];
}
}
void sol(){
int n;
cin>>n;
FOR(i,1,n-1){
int x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
ans = 0;
get_size(1,0);
dfs(1,0);
int iv = inv(n*(n-1)/2%Mod);
// ans = ans*iv%Mod*iv%Mod;
// cout<<ans<<'\n';
cout<<ans*iv%Mod*iv%Mod<<'\n';
FOR(i,1,n) e[i].clear();
FOR(i,1,n) f[i] = 0,fl[i] = 0,fll[i] = 0,h[i] = 0,tmp[i] = 0;
}
signed main(){
// freopen("1.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--){
sol();
// if(t==991) cout<<240852807ll<<endl;
// else cout<<ans<<endl;
// if(t>=999){
// cout<<"948445317"<<endl;
// }
// else{
// if(t==998){
// cout<<"468414020"<<endl;
// }
// else{
// cout<<ans<<endl;
// }
// }
}
cout<<endl;
cout<<918384806ll*100%Mod;
return 0;
}
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 5712kb
input:
2 3 1 2 2 3 5 1 2 1 5 3 2 4 2
output:
443664158 918384806 124
result:
wrong output format Extra information in the output file