沙伯求助简单树上背包
  • 板块灌水区
  • 楼主Shaber
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/4/21 20:32
  • 上次更新2023/10/23 17:53:18
查看原帖
沙伯求助简单树上背包
244239
Shaber楼主2023/4/21 20:32
ll calc(ll x) {
	return pre[x];
}
void dfs(int x,int fa) {
	sz[x]=1;
	f[x][sz[x]][0]=1;
	for(int to:g[x]) {
		if(to==fa) continue;
		dfs(to,x);
		sz[x]+=sz[to];
		for(int i=sz[x];i>=1;i--) {
		    ll a0=f[x][i][0],a1=f[x][i][1];
		    f[x][i][0]=f[x][i][1]=0;
			for(int j=sz[to];j>=1;j--) {
                (f[x][i][0]+=(a1*f[to][j][0]%p))%=p;
				(f[x][i][0]+=(a0*f[to][j][1]%p))%=p;
				(f[x][i][1]+=(a0*f[to][j][0]%p))%=p;
				(f[x][i][1]+=(a1*f[to][j][1]%p))%=p;	
				if(j<=i-scc[x]) {
					(f[x][i][0]+=(f[x][i-j][1]*f[to][j][1]%p*calc((i-j)*j-1)%p))%=p;
					(f[x][i][0]+=(f[x][i-j][0]*f[to][j][0]%p*calc((i-j)*j-1)%p))%=p;
					(f[x][i][1]+=(f[x][i-j][1]*f[to][j][0]%p*calc((i-j)*j-1)%p))%=p;
					(f[x][i][1]+=(f[x][i-j][0]*f[to][j][1]%p*calc((i-j)*j-1)%p))%=p;
				}	
			}
		}
	}
}

题目数据范围是 n=5000n=5000,但实测 n=1000n=1000 要跑 30s30s。

有没有大佬能帮忙看下是复杂度错误还是常数太大,十分感谢。

2023/4/21 20:32
加载中...