求助 #8
查看原帖
求助 #8
671774
LUlululu1616楼主2023/5/6 19:41

rt,#8一直过不去WA,求大佬调

好像试了几下是因为乘积相乘然后乘炸了?

#include <bits/stdc++.h>
using namespace std;
const long long maxn=1e5+5,mod=1e9+7;
int n,K,dp[maxn][105][2][2],sz[maxn];
long long tmp[105][2][2];
vector<int> e[maxn];
void dfs(int u,int fa)
{
	sz[u]=1;
	dp[u][0][0][0]=dp[u][1][1][0]=1;
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i];
		if(v==fa)
			continue;
		dfs(v,u);
		for(int j=0;j<=min(K,sz[u]);j++)
		{
		    tmp[j][0][1]=dp[u][j][0][1];dp[u][j][0][1]=0;
		    tmp[j][0][0]=dp[u][j][0][0];dp[u][j][0][0]=0;
		    tmp[j][1][1]=dp[u][j][1][1];dp[u][j][1][1]=0;
		    tmp[j][1][0]=dp[u][j][1][0];dp[u][j][1][0]=0;
		}
		for(int j=0;j<=min(K,sz[u]);j++)
			for(int k=0;k<=min(K,sz[v]);k++) 
			{
				if(j+k>K)
					break;
			//	int temp=1ll*tmp[j][0][0]*dp[v][k][0][1]%mod;
				dp[u][j+k][0][0]+=1ll*tmp[j][0][0]*dp[v][k][0][1]%mod;
				dp[u][j+k][0][0]%=mod;
				
				dp[u][j+k][1][0]+=1ll*tmp[j][1][0]*(1ll*dp[v][k][0][0]+1ll*dp[v][k][0][1])%mod;
				dp[u][j+k][1][0]%=mod;
				
				dp[u][j+k][0][1]+=1ll*tmp[j][0][1]*(1ll*dp[v][k][0][1]+1ll*dp[v][k][1][1])%mod;
				dp[u][j+1][0][1]%=mod;
				dp[u][j+k][0][1]+=1ll*tmp[j][0][0]*dp[v][k][1][1]%mod;
				dp[u][j+k][0][1]%=mod;
				
				dp[u][j+k][1][1]+=1ll*tmp[j][1][1]*(1ll*dp[v][k][0][0]+1ll*dp[v][k][0][1]+1ll*dp[v][k][1][0]+1ll*dp[v][k][1][1])%mod;
				dp[u][j+k][1][1]%=mod;
				dp[u][j+k][1][1]+=1ll*tmp[j][1][0]*(1ll*dp[v][k][1][0]+1ll*dp[v][k][1][1])%mod;
				dp[u][j+k][1][1]%=mod;
			}
		sz[u]+=sz[v];
	}
}
int main()
{
	cin >>n>>K;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin >>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0);
	cout <<(dp[1][K][1][1]+dp[1][K][0][1])%mod<<endl;
	return 0;
}
2023/5/6 19:41
加载中...