QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#688336#9530. A Game On TreedoyoWA 1ms5716kbC++202.5kb2024-10-30 05:07:422024-10-30 05:07:43

Judging History

This is the latest submission verdict.

  • [2024-10-30 05:07:43]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 5716kb
  • [2024-10-30 05:07:42]
  • 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 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;
	for(auto nxt:e[x])if(nxt!=fa){
		get_size(nxt,x);
		totsize[x] += totsize[nxt];
	}
}

void dfs(int x,int fa){
	sz[x] = 1;
	f[x] = 1;
	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;
		//自己子树内一条到根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];
	}
}
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*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<<240852807ll*66*66%Mod;
    return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 5716kb

input:

2
3
1 2
2 3
5
1 2
1 5
3 2
4 2

output:

443664158
918384806
12289

result:

wrong output format Extra information in the output file