QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#688346#9530. A Game On TreedoyoWA 0ms5712kbC++202.9kb2024-10-30 06:08:542024-10-30 06:08:54

Judging History

This is the latest submission verdict.

  • [2024-10-30 06:08:54]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 5712kb
  • [2024-10-30 06:08:54]
  • Submitted

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

Details

Tip: Click on the bar to expand more detailed information

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