QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#600953#4816. GamesHarry27182ML 1ms9884kbC++143.4kb2024-09-29 20:07:222024-09-29 20:07:24

Judging History

This is the latest submission verdict.

  • [2024-09-29 20:07:24]
  • Judged
  • Verdict: ML
  • Time: 1ms
  • Memory: 9884kb
  • [2024-09-29 20:07:22]
  • Submitted

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 i=0;i<=tot+1;i++)for(int j=0;j<=m+1;j++)pre[i][j][0]=suf[i][j][0]=pre[i][j][1]=suf[i][j][1]=0;
	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: 9756kb

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: 0
Accepted
time: 1ms
memory: 9884kb

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:

896
2820
2433
1218
2433
2272

result:

ok 6 numbers

Test #3:

score: 0
Accepted
time: 0ms
memory: 9804kb

input:

1 1 1
1 0

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: -100
Memory Limit Exceeded

input:

10 3 10
9 10
7 5
7 3
9 3
1 8
1 3
4 2
9 6
4 1
1 3
4 2
6 3
8 2
7 1
8 0
6 3
7 1
2 3
1 1

output:


result: