QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#600901 | #4816. Games | Harry27182 | WA | 2ms | 9792kb | C++14 | 3.3kb | 2024-09-29 19:54:21 | 2024-09-29 19:54:21 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
struct edge{int v,nxt;}e[200005];
int cnt,h[100005],f[100005][35][2],g[100005][35][2],sum[100005][35][2];
int pre[100005][35][2],suf[100005][35][2],n,m,q,p[100005],u,v,x,y;
const int mod=998244353;
void Add(int &x,int y){x=(x+y>=mod?x+y-mod:x+y);}
void add(int u,int v){e[++cnt]={v,h[u]};h[u]=cnt;}
void dfs1(int u,int fa)
{
for(int i=1;i<=m;i++)f[u][i][0]=1;
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==fa)continue;
dfs1(v,u);
for(int j=1;j<=m;j++)
{
int lst0=f[u][j][0],lst1=f[u][j][1];
f[u][j][0]=f[u][j][1]=0;
Add(f[u][j][0],1ll*lst0*sum[v][j][0]%mod);
Add(f[u][j][1],1ll*lst1*sum[v][j][0]%mod);
Add(f[u][j][1],1ll*lst0*(sum[v][m][0]-sum[v][j][0]+mod)%mod);
Add(f[u][j][1],1ll*lst0*(sum[v][m][1]-sum[v][j-1][1]+mod)%mod);
}
}
for(int i=1;i<=m;i++)
{
sum[u][i][0]=f[u][i][0];sum[u][i][1]=f[u][i][1];
//cout<<u<<' '<<i<<' '<<f[u][i][0]<<' '<<f[u][i][1]<<'\n';
Add(sum[u][i][0],sum[u][i-1][0]);Add(sum[u][i][1],sum[u][i-1][1]);
}
}
void dfs2(int u,int fa)
{
int tot=0;
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==fa)continue;
p[++tot]=v;
}
for(int j=1;j<=m;j++)pre[0][j][0]=suf[tot+1][j][0]=1;
for(int i=1;i<=tot;i++)
{
int v=p[i];
for(int j=1;j<=m;j++)
{
pre[i][j][0]=pre[i][j-1][0];
Add(pre[i][j][0],f[v][j][0]);
}
for(int j=m;j>=1;j--)
{
pre[i][j][1]=pre[i][j+1][1];
Add(pre[i][j][1],f[v][j][1]);Add(pre[i][j][1],f[v][j+1][0]);
}
for(int j=1;j<=m;j++)
{
int now=pre[i][j][1];
pre[i][j][1]=1ll*pre[i-1][j][1]*pre[i][j][0]%mod;
Add(pre[i][j][1],1ll*now*pre[i-1][j][0]%mod);
pre[i][j][0]=1ll*pre[i][j][0]*pre[i-1][j][0]%mod;
}
}
for(int i=tot;i>=1;i--)
{
int v=p[i];
for(int j=1;j<=m;j++)
{
suf[i][j][0]=suf[i][j-1][0];
Add(suf[i][j][0],f[v][j][0]);
}
for(int j=m;j>=1;j--)
{
suf[i][j][1]=suf[i][j+1][1];
Add(suf[i][j][1],f[v][j][1]);Add(suf[i][j][1],f[v][j+1][0]);
}
for(int j=1;j<=m;j++)
{
int now=suf[i][j][1];
suf[i][j][1]=1ll*suf[i+1][j][1]*suf[i][j][0]%mod;
Add(suf[i][j][1],1ll*now*suf[i+1][j][0]%mod);
suf[i][j][0]=1ll*suf[i][j][0]*suf[i+1][j][0]%mod;
}
}
for(int i=1;i<=tot;i++)
{
int v=p[i];
for(int j=1;j<=m;j++)
{
g[v][j][0]=1ll*pre[i-1][j][0]*suf[i+1][j][0]%mod*g[u][j][0]%mod;
g[v][j][1]=1ll*pre[i-1][j][0]*suf[i+1][j][0]%mod*g[u][j][1]%mod;
Add(g[v][j][1],1ll*pre[i-1][j][1]*suf[i+1][j][0]%mod*g[u][j][0]%mod);
Add(g[v][j][1],1ll*pre[i-1][j][0]*suf[i+1][j][1]%mod*g[u][j][0]%mod);
}
for(int j=1;j<=m;j++)Add(g[v][j][0],g[v][j-1][0]);
for(int j=m;j>=1;j--)Add(g[v][j][1],g[v][j+1][1]);
for(int j=1;j<=m;j++)Add(g[v][j][1],(mod+g[v][m][0]-g[v][j][0])%mod);
//for(int j=1;j<=m;j++)cout<<v<<' '<<j<<' '<<g[v][j][0]<<' '<<g[v][j][1]<<'\n';
}
for(int i=1;i<=tot;i++)dfs2(p[i],u);
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m>>q;m++;
for(int i=1;i<n;i++)
{
cin>>u>>v;
add(u,v);add(v,u);
}
dfs1(1,0);
for(int i=1;i<=m;i++)g[1][i][0]=1;
dfs2(1,0);
while(q--)
{
cin>>x>>y;y++;//cout<<x<<' '<<y<<'\n';
int ans=1ll*f[x][y][0]*g[x][y][0]%mod;
Add(ans,1ll*f[x][y][1]*g[x][y][0]%mod);
Add(ans,1ll*f[x][y][0]*g[x][y][1]%mod);
cout<<ans<<'\n';
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 9792kb
input:
3 2 5 1 2 3 2 3 1 1 0 2 0 2 1 2 2
output:
7 9 5 8 9
result:
ok 5 number(s): "7 9 5 8 9"
Test #2:
score: -100
Wrong Answer
time: 2ms
memory: 9760kb
input:
6 6 6 6 1 1 3 2 6 4 2 5 2 2 1 3 2 5 3 5 6 5 3 1 1
output:
101684 2820 146163 1218 146163 2272
result:
wrong answer 1st numbers differ - expected: '896', found: '101684'