QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#783980 | #9530. A Game On Tree | Dixiky_215 | WA | 4ms | 5772kb | C++20 | 2.8kb | 2024-11-26 12:31:09 | 2024-11-26 12:31:12 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2e5+7;
int t,n;
int cnt=0,head[MAXN],to[MAXN],nxt[MAXN];
bool vis[MAXN];
ll sum1[MAXN],sum2[MAXN],siz[MAXN];
ll mod=998244353LL,ans;
ll ksm(ll x,ll y)
{
ll res=1LL;
while(y)
{
if(y&1LL) res=(res*x)%mod;
x=(x*x)%mod;y=y>>1LL;
}
return res;
}
ll inv(ll x)
{
return ksm(x%mod,mod-2LL);
}
ll work(ll x)
{
return (x*x)%mod;
}
void add(int x,int y)
{
to[++cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
return;
}
void dfs(int x,int fa)
{
vis[x]=1;siz[x]=1LL;
ll sumg=0LL;
ll sumk1=0LL,sumk2=0LL;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(vis[y]) continue;
dfs(y,x);
siz[x]+=siz[y];
sumg+=work(siz[y]);sumg%=mod;
sumk1+=sum1[y];sumk1%=mod;
sumk2+=sum2[y];sumk2%=mod;
sum1[x]+=sum1[y]+work(siz[y]);
sum1[x]%=mod;
sum2[x]+=sum2[y]+2LL*sum1[y]+work(siz[y]);
sum2[x]%=mod;
}
ll sumk=0LL;
// ans+=sum2[x];ans%=mod;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(y==fa) continue;
ll sumy1=sum1[y],sumy2=sum2[y];
ll sumx1,sumx2;
sumx1=sumk1-sum1[y];
sumx1%=mod;
sumx2=sumk2-sum2[y];
sumx2%=mod;
ll sss,num;
num=sum2[y]+2LL*sum1[y]+work(siz[y]);num%=mod;
if(siz[x]-siz[y]>1)
{
sss=sumx2+sumy2+2LL*sumx1*sumy1%mod+4LL*sumx1+4LL*sumy1+4LL*work(siz[x]-siz[y]-1LL)*work(siz[y])%mod;
sumk+=sss%mod;sumk%=mod;
}
sss=num*((2LL*(siz[x]-siz[y])*((ll) n-siz[x]))%mod);
ans+=sss%mod;ans%=mod;
sss=work(siz[x]-siz[y])-(sumg-work(siz[y]));
sss%=mod;
sss*=num;sss%=mod;
ans+=sss;ans%=mod;
}
sumk=(sumk*inv(2LL))%mod;
ans+=sumk;ans%=mod;
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
add(u,v);add(v,u);
}
ans=0LL;
dfs(1,0);
ll num=(ll) n*(ll) (n-1LL)%mod*inv(2LL);
num%=mod;
num=(num*num)%mod;
ll sss=918384806LL;
// cerr<<ans<<" "<<(sss*100LL)%mod<<" asd"<<endl;
ans=(ans*ksm(num,mod-2LL))%mod;
ans=(ans+mod)%mod;
cout<<ans<<'\n';
for(int i=0;i<=n;i++)
{
vis[i]=head[i]=0;
sum1[i]=sum2[i]=0LL;
}
for(int i=0;i<=cnt;i++)
{
to[i]=nxt[i]=0;
}
cnt=0;
}
return 0;
}
/*
1
5
1 2
1 5
3 2
4 2
2
3
1 2
2 3
5
1 2
1 5
3 2
4 2
*/
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 5680kb
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: 4ms
memory: 5772kb
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:
948445317 569475948 550143557 918384806 230462027 487662742 776412276 869581749 284165062 843424050 304248860 887328316 969534518 479184791 815849091 306128270 613246533 370097398 557784440 948948337 433351719 128600358 680516117 239547836 698771049 892149955 639615828 397897145 488030574 108697720 ...
result:
wrong answer 2nd lines differ - expected: '468414020', found: '569475948'