QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#698673 | #9530. A Game On Tree | Okuchiri | WA | 2ms | 11948kb | C++20 | 3.6kb | 2024-11-01 21:15:22 | 2024-11-01 21:15:23 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
ll n,siz[100010],mson[100010];
ll dfl[100010],dfr[100010];
ll dep[100010];
ll sum[100010];
ll inv[100010];
ll dfn,ans;
vector<ll>e[100010];
vector<ll>c[100010];
ll k0,k1,k2;
ll ksm(ll x,ll y)
{
ll res=1;
while(y)
{
if(y&1)res=res*x%mod;
x=x*x%mod;
y=y/2;
}
return res;
}
void dfs(ll x,ll pre)
{
dep[x]=dep[pre]+1;
dfn++;
inv[dfn]=x;
c[x].clear();
dfl[x]=dfn;
dfr[x]=dfn;
siz[x]=1;
for(auto y:e[x])
{
if(y==pre)continue;
dfs(y,x);
c[x].push_back(siz[y]);
siz[x]+=siz[y];
dfr[x]=dfr[y];
if(mson[x]==0||siz[mson[x]]<siz[y])mson[x]=y;
}
c[x].push_back(n-siz[x]);
}
void dfs1(ll x,ll pre,ll keep)
{
for(auto y:e[x])
{
if(y==pre||y==mson[x])continue;
dfs1(y,x,0);
}
if(mson[x])
{
dfs1(mson[x],x,1);
ll t=((sum[mson[x]]-(n-siz[mson[x]])*(siz[mson[x]]-1)%mod*2%mod+mod)%mod+(2*siz[mson[x]]-1))%mod;
k2=(k2+2*k1+k0+t)%mod;
k1=(k1+k0+t)%mod;
k0=(k0+t)%mod;
}
for(auto y:e[x])
{
if(y==mson[x]||y==pre)continue;
for(int j=dfl[y];j<=dfr[y];j++)
{
ll t=((sum[inv[j]]-(n-siz[inv[j]])*(siz[inv[j]]-1)%mod*2%mod+mod)%mod+(2*siz[inv[j]]-1)%mod)%mod;
ll len=dep[inv[j]]-dep[x];
ans=(ans+(t*k2%mod+2*t%mod*len%mod*k1%mod+t*k0%mod*len%mod*len%mod)%mod)%mod;
}
for(int j=dfl[y];j<=dfr[y];j++)
{
ll t=((sum[inv[j]]-(n-siz[inv[j]])*(siz[inv[j]]-1)%mod*2%mod+mod)%mod+(2*siz[inv[j]]-1)%mod)%mod;
ll len=dep[inv[j]]-dep[x];
k2=(k2+t*len%mod*len%mod)%mod;
k1=(k1+t*len%mod)%mod;
k0=(k0+t)%mod;
}
}
if(keep==0)
{
for(auto y:e[x])
{
if(y==pre)continue;
for(int j=dfl[y];j<=dfr[y];j++)
{
ll t=((sum[inv[j]]-(n-siz[inv[j]])*(siz[inv[j]]-1)%mod*2%mod+mod)%mod+(2*siz[inv[j]]-1)%mod)%mod;
ll len=dep[inv[j]]-dep[x];
k2=(k2-t*len%mod*len%mod+mod)%mod;
k1=(k1-t*len%mod+mod)%mod;
k0=(k0-t+mod)%mod;
}
}
}
}
ll f0[100010],f1[100010],f2[100010];
void dfs2(ll x,ll pre)
{
f2[x]=0;
f1[x]=0;
f0[x]=0;
for(auto y:e[x])
{
if(y==pre)continue;
dfs2(y,x);
ans=(ans+(f2[y]+2*f1[y]+f0[y]+(sum[y]-(n-siz[y])*(siz[y]-1)%mod*2%mod)+2*siz[y]-1)%mod*(sum[x]-siz[y]*(n-siz[y]-1)%mod*2%mod+mod+2*(n-siz[y])-1)%mod);
ll t=((sum[y]-(n-siz[y])*(siz[y]-1)%mod*2%mod+mod)%mod+(2*siz[y]-1))%mod;
f2[x]=(f2[x]+f2[y]+2*f1[y]+f0[y]+t)%mod;
f1[x]=(f1[x]+f1[y]+f0[y]+t)%mod;
f0[x]=(f0[x]+t)%mod;
}
}
void work()
{
k0=0;k1=0;k2=0;
cin>>n;
dfn=0;ans=0;
for(int i=1;i<=n;i++)e[i].clear(),mson[i]=0;
for(int i=1;i<n;i++)
{
ll x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
ll s=0;
sum[i]=0;
for(auto y:c[i])
{
sum[i]=(sum[i]+s*y%mod)%mod;
s+=y;
}
sum[i]=sum[i]*2%mod;
}
dfs1(1,0,0);
dfs2(1,0);
ll t1=n*(n-1)%mod*ksm(2,mod-2)%mod;
t1=t1*t1%mod;
cout<<ans*ksm(t1,mod-2)%mod<<'\n';
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--)
{
work();
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 2ms
memory: 11948kb
input:
2 3 1 2 2 3 5 1 2 1 5 3 2 4 2
output:
443664158 918384806
result:
ok 2 lines
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 9852kb
input:
1000 7 3 6 4 3 5 3 2 6 1 4 7 1 12 5 7 10 7 2 10 11 2 1 7 8 1 4 2 9 11 6 9 12 11 3 5 6 2 5 1 2 4 5 6 4 3 6 5 2 5 1 5 4 5 3 2 8 1 8 2 8 4 2 6 1 5 6 7 6 3 8 8 3 8 7 3 4 8 6 4 2 7 5 2 1 4 4 3 1 4 3 2 1 6 5 1 6 1 2 5 3 5 4 2 12 8 11 5 11 12 8 3 12 6 12 2 3 4 6 10 11 1 5 9 5 7 5 9 6 1 7 6 4 7 8 7 5 4 9 6 ...
output:
380283565 42166431 146409174 89841993 720671308 169345027 776412276 97606116 951494620 482946923 234156085 367409382 814105397 969598684 472748810 633946786 878849197 584006902 451058562 600795214 201665529 370521821 652401982 545337194 399297743 37619789 472255849 365428738 310564911 739440263 7301...
result:
wrong answer 1st lines differ - expected: '948445317', found: '380283565'