QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#658483 | #4540. Counting Stickmen | qq0121 | AC ✓ | 432ms | 58904kb | C++20 | 1.7kb | 2024-10-19 16:53:30 | 2024-10-19 16:53:30 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
// #define PII pair<int,int>
const int N=5e5+9;
const int mod=998244353;
int n,m,k;
int a,b;
vector<int>e[N*2];
void solve()
{
cin>>n;
for(int i=0;i<=n;i++)
{
e[i].clear();
}
vector<int>d(n+2),q(n+2);
for(int i=1;i<=n-1;i++)
{
// e[i].clear();
int W,w;
cin>>W>>w;
e[W].push_back(w);
e[w].push_back(W);
q[W]++;
q[w]++;
}
for(int i=1;i<=n;i++)
{
d[i]=q[i]-1;
}
int ans=0;
auto dfs=[&](int x)->int
{
int res=0;
if(q[x]>=4)
{
int a=0;
int cnt=0;
for(auto k:e[x])
{
int jj=k;
// if(jj==x)
// {
// continue;
// }
a=(a+cnt*d[jj])%mod;
cnt=(cnt+d[jj])%mod;//手
}
for(auto k:e[x])
{
int jj=k;
int sum=((a-((cnt-d[jj])%mod+mod)%mod*d[jj]%mod)%mod+mod)%mod;
int xx=d[jj]*(d[jj]-1)/2%mod;
res=(res+(q[x]-3)*xx%mod*sum%mod)%mod;
}
}
return res;
};
for(int i=1;i<=n;i++)
{
ans=(ans+dfs(i))%mod;
// cout<<i<<" "<<ans<<"\n";
}
// for(auto k:e[1])
// {
// cout<<k<<" ";
// }
cout<<ans<<"\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 432ms
memory: 58904kb
input:
15 9 1 2 2 3 3 4 2 5 5 6 2 7 7 8 7 9 9999 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 28 1 29 1 30 1 31 1 32 1 33 1 34 1 35 1 36 1 37 1 38 1 39 1 40 1 41 1 42 1 43 1 44 1 45 1 46 1 47 1 48 1 49 1 50 1 51 1 52 1 53 1 54 1...
output:
1 311255965 672169659 323323769 834196165 147532751 608867683 433545054 268282647 580524749 250163191 0 876200211 781358751 903681473
result:
ok 15 lines